diff --git a/FredBoat/build.gradle b/FredBoat/build.gradle index 5039b4760..6947daca5 100644 --- a/FredBoat/build.gradle +++ b/FredBoat/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'org.junit.platform.gradle.plugin' description = 'FredBoat Discord Music Bot' mainClassName = "fredboat.FredBoat" -version '2.0' +version '2.1' ext { moduleName = 'FredBoat' } @@ -53,6 +53,7 @@ dependencies { compile group: 'org.yaml', name: 'snakeyaml', version: '1.19' compile group: 'it.unimi.dsi', name: 'fastutil', version: '8.1.1' compile group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '3.1.1' + compile group: 'io.prometheus', name: 'simpleclient', version: '0.1.0' compile group: 'io.prometheus', name: 'simpleclient_hotspot', version: '0.1.0' compile group: 'io.prometheus', name: 'simpleclient_logback', version: '0.1.0' @@ -60,7 +61,8 @@ dependencies { compile group: 'io.prometheus', name: 'simpleclient_guava', version: '0.1.0' compile group: 'io.prometheus', name: 'simpleclient_servlet', version: '0.1.0' - compile group: 'space.npstr.SqlSauce', name: 'sqlsauce-core', version: 'a5c9afd96d1928d9a51e799249a6eb5b08b4f473' + compile group: 'space.npstr.SqlSauce', name: 'sqlsauce-core', version: '8a939c06651fd06877d705874834463373cfb596' + compile group: 'space.npstr.SqlSauce', name: 'discord-entities', version: '8a939c06651fd06877d705874834463373cfb596' compile group: 'org.hibernate', name: 'hibernate-ehcache', version: '5.2.12.Final' compile group: 'org.flywaydb', name: 'flyway-core', version: '5.0.3' diff --git a/FredBoat/config.yaml b/FredBoat/config.yaml index 6c6033f95..3e4bce222 100644 --- a/FredBoat/config.yaml +++ b/FredBoat/config.yaml @@ -3,7 +3,7 @@ patron: false # Set this to true for self hosting the music bot development: true # Set this to true for self hosting the full bot (including non music commands) prefix: '<<' # Default prefix used by the bot restServerEnabled: true # Set this to false if you are running multiple FredBoat bots on the same machine -admins: [] # Add comma separated userIds and roleIds that should have access to bot admin commands +admins: [] # Add comma separated userIds and roleIds that should have access to bot admin commands. Find role ids with the ;;roleinfo command useAutoBlacklist: true # Set to true to automatically blacklist users who frequently hit the rate limits game: "" # Set the displayed game/status. Leave empty quote marks for the default status continuePlayback: false # Set to true to force the player to continue playback even if left alone @@ -15,7 +15,8 @@ enableTwitch: true # Set to true to enable playing Twitch links enableVimeo: true # Set to true to enable playing Vimeo links enableMixer: true # Set to true to enable playing Mixer links enableSpotify: true # Set to true to enable playing Spotify links -enableHttp: true # Set to true to enable playing direct links +enableLocal: false # Set to true to enable playing local files +enableHttp: false # Set to true to enable playing direct links # THIS IS TEMPORARY UNTIL COMMANDS ARE MODULARIZED tempUseVoiceChannelCleanup: true # This acts as an override if set to false no vcCleanupAgent will be run diff --git a/FredBoat/src/main/java/fredboat/Config.java b/FredBoat/src/main/java/fredboat/Config.java index bb99c9791..ce2f6bf27 100644 --- a/FredBoat/src/main/java/fredboat/Config.java +++ b/FredBoat/src/main/java/fredboat/Config.java @@ -28,6 +28,7 @@ import com.google.common.base.CharMatcher; import fredboat.audio.player.PlayerLimitManager; import fredboat.command.admin.SentryDsnCommand; +import fredboat.commandmeta.CommandInitializer; import fredboat.commandmeta.MessagingException; import fredboat.shared.constant.DistributionEnum; import fredboat.util.DiscordUtil; @@ -89,6 +90,7 @@ public class Config { private boolean vimeoAudio; private boolean mixerAudio; private boolean spotifyAudio; + private boolean localAudio; private boolean httpAudio; // temporary config values todo remove after merging main + music @@ -200,6 +202,7 @@ public Config(File credentialsFile, File configFile) { vimeoAudio = (Boolean) config.getOrDefault("enableVimeo", true); mixerAudio = (Boolean) config.getOrDefault("enableMixer", true); spotifyAudio = (Boolean) config.getOrDefault("enableSpotify", true); + localAudio = (Boolean) config.getOrDefault("enableLocal", false); httpAudio = (Boolean) config.getOrDefault("enableHttp", false); //temp configs @@ -462,7 +465,7 @@ public boolean useAutoBlacklist() { public String getGame() { if (game == null || game.isEmpty()) { - return "Say " + getPrefix() + "help"; + return "Say " + getPrefix() + CommandInitializer.HELP_COMM_NAME; } else { return game; } @@ -500,6 +503,10 @@ public boolean isSpotifyEnabled() { return spotifyAudio; } + public boolean isLocalEnabled() { + return localAudio; + } + public boolean isHttpEnabled() { return httpAudio; } diff --git a/FredBoat/src/main/java/fredboat/FredBoat.java b/FredBoat/src/main/java/fredboat/FredBoat.java index 29c3ac020..b66770d06 100644 --- a/FredBoat/src/main/java/fredboat/FredBoat.java +++ b/FredBoat/src/main/java/fredboat/FredBoat.java @@ -30,9 +30,8 @@ import fredboat.api.API; import fredboat.audio.player.LavalinkManager; import fredboat.audio.queue.MusicPersistenceHandler; +import fredboat.commandmeta.CommandInitializer; import fredboat.commandmeta.CommandRegistry; -import fredboat.commandmeta.init.MainCommandInitializer; -import fredboat.commandmeta.init.MusicCommandInitializer; import fredboat.db.DatabaseManager; import fredboat.event.EventListenerBoat; import fredboat.feature.I18n; @@ -173,10 +172,8 @@ public static void main(String[] args) throws LoginException, IllegalArgumentExc LavalinkManager.ins.start(); //Commands - if (Config.CONFIG.getDistribution() == DistributionEnum.DEVELOPMENT) - MainCommandInitializer.initCommands(); - - MusicCommandInitializer.initCommands(); + CommandInitializer.initCommands(); + log.info("Loaded commands, registry size is " + CommandRegistry.getTotalSize()); if (!Config.CONFIG.isPatronDistribution() && Config.CONFIG.useVoiceChannelCleanup()) { log.info("Starting VoiceChannelCleanupAgent."); @@ -186,8 +183,6 @@ public static void main(String[] args) throws LoginException, IllegalArgumentExc "either running Patron distro or overridden by temp config"); } - log.info("Loaded commands, registry size is " + CommandRegistry.getSize()); - //Check MAL creds executor.submit(FredBoat::hasValidMALLogin); diff --git a/FredBoat/src/main/java/fredboat/audio/player/AbstractPlayer.java b/FredBoat/src/main/java/fredboat/audio/player/AbstractPlayer.java index e5fab7b19..e3be4f724 100644 --- a/FredBoat/src/main/java/fredboat/audio/player/AbstractPlayer.java +++ b/FredBoat/src/main/java/fredboat/audio/player/AbstractPlayer.java @@ -32,6 +32,7 @@ import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; import com.sedmelluq.discord.lavaplayer.source.bandcamp.BandcampAudioSourceManager; import com.sedmelluq.discord.lavaplayer.source.beam.BeamAudioSourceManager; +import com.sedmelluq.discord.lavaplayer.source.local.LocalAudioSourceManager; import com.sedmelluq.discord.lavaplayer.source.soundcloud.SoundCloudAudioSourceManager; import com.sedmelluq.discord.lavaplayer.source.twitch.TwitchStreamAudioSourceManager; import com.sedmelluq.discord.lavaplayer.source.vimeo.VimeoAudioSourceManager; @@ -51,6 +52,7 @@ import fredboat.audio.source.SpotifyPlaylistSourceManager; import fredboat.commandmeta.MessagingException; import fredboat.shared.constant.DistributionEnum; +import fredboat.util.TextUtils; import lavalink.client.player.IPlayer; import lavalink.client.player.LavalinkPlayer; import lavalink.client.player.LavaplayerPlayerWrapper; @@ -113,7 +115,7 @@ private static void initAudioPlayerManager() { public static AudioPlayerManager registerSourceManagers(AudioPlayerManager mng) { mng.registerSourceManager(new PlaylistImportSourceManager()); //Determine which Source managers are enabled - //By default, all are enabled except HttpAudioSources + //By default, all are enabled except LocalAudioSources and HttpAudioSources, see config.yaml and Config class if (Config.CONFIG.isYouTubeEnabled()) { YoutubeAudioSourceManager youtubeAudioSourceManager = new YoutubeAudioSourceManager(); youtubeAudioSourceManager.configureRequests(config -> RequestConfig.copy(config) @@ -139,6 +141,9 @@ public static AudioPlayerManager registerSourceManagers(AudioPlayerManager mng) if (Config.CONFIG.isSpotifyEnabled()) { mng.registerSourceManager(new SpotifyPlaylistSourceManager()); } + if (Config.CONFIG.isLocalEnabled()) { + mng.registerSourceManager(new LocalAudioSourceManager()); + } if (Config.CONFIG.isHttpEnabled()) { //add new source managers above the HttpAudio one, because it will either eat your request or throw an exception //so you will never reach a source manager below it @@ -285,7 +290,7 @@ public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason log.info("Track " + track.getIdentifier() + " was cleaned up"); } else if (endReason == AudioTrackEndReason.LOAD_FAILED) { if (onErrorHook != null) - onErrorHook.accept(new MessagingException("Track `" + track.getInfo().title + "` failed to load. Skipping...")); + onErrorHook.accept(new MessagingException("Track `" + TextUtils.escapeAndDefuse(track.getInfo().title) + "` failed to load. Skipping...")); audioTrackProvider.skipped(); loadAndPlay(); } else { diff --git a/FredBoat/src/main/java/fredboat/audio/player/GuildPlayer.java b/FredBoat/src/main/java/fredboat/audio/player/GuildPlayer.java index 088dcb012..48333f227 100644 --- a/FredBoat/src/main/java/fredboat/audio/player/GuildPlayer.java +++ b/FredBoat/src/main/java/fredboat/audio/player/GuildPlayer.java @@ -44,6 +44,7 @@ import fredboat.messaging.CentralMessaging; import fredboat.perms.PermissionLevel; import fredboat.perms.PermsUtil; +import fredboat.util.TextUtils; import net.dv8tion.jda.core.JDA; import net.dv8tion.jda.core.Permission; import net.dv8tion.jda.core.entities.Guild; @@ -98,7 +99,7 @@ private void announceTrack(AudioTrackContext atc) { TextChannel activeTextChannel = getActiveTextChannel(); if (activeTextChannel != null) { CentralMessaging.sendMessage(activeTextChannel, - atc.i18nFormat("trackAnnounce", atc.getEffectiveTitle())); + atc.i18nFormat("trackAnnounce", TextUtils.escapeAndDefuse(atc.getEffectiveTitle()))); } } } diff --git a/FredBoat/src/main/java/fredboat/audio/queue/AudioLoader.java b/FredBoat/src/main/java/fredboat/audio/queue/AudioLoader.java index e8a1c3be1..9e935336e 100644 --- a/FredBoat/src/main/java/fredboat/audio/queue/AudioLoader.java +++ b/FredBoat/src/main/java/fredboat/audio/queue/AudioLoader.java @@ -175,9 +175,9 @@ public void trackLoaded(AudioTrack at) { if (!context.isQuiet()) { context.reply(gplayer.isPlaying() ? - context.i18nFormat("loadSingleTrack", at.getInfo().title) + context.i18nFormat("loadSingleTrack", TextUtils.escapeAndDefuse(at.getInfo().title)) : - context.i18nFormat("loadSingleTrackAndPlay", at.getInfo().title) + context.i18nFormat("loadSingleTrackAndPlay", TextUtils.escapeAndDefuse(at.getInfo().title)) ); } else { log.info("Quietly loaded " + at.getIdentifier()); @@ -311,7 +311,7 @@ private void loadSplit(AudioTrack at, IdentifierContext ic){ mb.append("`[") .append(TextUtils.formatTime(atc.getEffectiveDuration())) .append("]` ") - .append(atc.getEffectiveTitle()) + .append(TextUtils.escapeAndDefuse(atc.getEffectiveTitle())) .append("\n"); } diff --git a/FredBoat/src/main/java/fredboat/command/admin/AnnounceCommand.java b/FredBoat/src/main/java/fredboat/command/admin/AnnounceCommand.java index 1b95e1135..775bb34fe 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/AnnounceCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/AnnounceCommand.java @@ -27,7 +27,7 @@ import fredboat.audio.player.GuildPlayer; import fredboat.audio.player.PlayerRegistry; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; diff --git a/FredBoat/src/main/java/fredboat/command/admin/BotRestartCommand.java b/FredBoat/src/main/java/fredboat/command/admin/BotRestartCommand.java index 56fffd875..f17c37297 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/BotRestartCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/BotRestartCommand.java @@ -32,7 +32,7 @@ import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; import fredboat.shared.constant.ExitCodes; -import org.slf4j.LoggerFactory; +import fredboat.util.TextUtils; import javax.annotation.Nonnull; import java.util.concurrent.ExecutionException; @@ -40,26 +40,38 @@ public class BotRestartCommand extends Command implements ICommandRestricted { - private static final org.slf4j.Logger log = LoggerFactory.getLogger(BotRestartCommand.class); - public BotRestartCommand(String name, String... aliases) { super(name, aliases); } + @Nonnull + private String code = TextUtils.randomAlphaNumericString(4); + @Override public void onInvoke(@Nonnull CommandContext context) { - try { - context.replyWithName(" Restarting...").getWithDefaultTimeout(); - } catch (InterruptedException | ExecutionException | TimeoutException ignored) { + if (context.hasArguments()) { + if (context.rawArgs.equals(code)) { + try { + context.replyWithName("Restarting...").getWithDefaultTimeout(); + } catch (InterruptedException | ExecutionException | TimeoutException ignored) { + } + FredBoat.shutdown(ExitCodes.EXIT_CODE_RESTART); + return; + } else { + context.reply(String.format("Your input `%s` did not fit the required code `%s`. A new code will be issued.", + TextUtils.escapeMarkdown(context.rawArgs), code)); + } } - FredBoat.shutdown(ExitCodes.EXIT_CODE_RESTART); + code = TextUtils.randomAlphaNumericString(4); + context.reply(String.format("This will **restart the whole bot**. " + + "Please confirm by issuing this command again, with the following confirmation code appended: `%s`", code)); } @Nonnull @Override public String help(@Nonnull Context context) { - return "{0}{1}\n#Restarts the bot."; + return "{0}{1} [code]\n#Restart the bot."; } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/admin/CompileCommand.java b/FredBoat/src/main/java/fredboat/command/admin/CompileCommand.java deleted file mode 100644 index 862074f24..000000000 --- a/FredBoat/src/main/java/fredboat/command/admin/CompileCommand.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Frederik Ar. Mikkelsen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -package fredboat.command.admin; - -import fredboat.commandmeta.abs.Command; -import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.messaging.CentralMessaging; -import fredboat.messaging.internal.Context; -import fredboat.perms.PermissionLevel; -import fredboat.util.log.SLF4JInputStreamErrorLogger; -import fredboat.util.log.SLF4JInputStreamLogger; -import net.dv8tion.jda.core.entities.Message; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nonnull; -import java.io.File; -import java.io.IOException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -@Deprecated //we dont use maven anymore. todo decide if can be repurposed for gradle -public class CompileCommand extends Command implements ICommandRestricted { - - private static final Logger log = LoggerFactory.getLogger(CompileCommand.class); - - public CompileCommand(String name, String... aliases) { - super(name, aliases); - } - - @Override - public void onInvoke(@Nonnull CommandContext context) { - context.reply("*Now updating...*\n\nRunning `git clone`... ", - status -> cloneAndCompile(context, status), - throwable -> { - throw new RuntimeException(throwable); - } - ); - } - - private void cloneAndCompile(CommandContext context, Message status) { - try { - Runtime rt = Runtime.getRuntime(); - - String branch = "master"; - if (context.hasArguments()) { - branch = context.args[0]; - } - String githubUser = "Frederikam"; - if (context.args.length > 1) { - githubUser = context.args[1]; - } - - //Clear any old update folder if it is still present - try { - Process rm = rt.exec("rm -rf update"); - rm.waitFor(5, TimeUnit.SECONDS); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - - Process gitClone = rt.exec("git clone https://github.com/" + githubUser + "/FredBoat.git --branch " + branch + " --recursive --single-branch update"); - new SLF4JInputStreamLogger(log, gitClone.getInputStream()).start(); - new SLF4JInputStreamErrorLogger(log, gitClone.getInputStream()).start(); - - if (!gitClone.waitFor(120, TimeUnit.SECONDS)) { - CentralMessaging.editMessage(status, status.getRawContent() + "[:anger: timed out]\n\n"); - throw new RuntimeException("Operation timed out: git clone"); - } else if (gitClone.exitValue() != 0) { - CentralMessaging.editMessage(status, status.getRawContent() + "[:anger: returned code " + gitClone.exitValue() + "]\n\n"); - throw new RuntimeException("Bad response code"); - } - try { - CentralMessaging.editMessage(status, status.getRawContent() + "👌🏽\n\nRunning `mvn package shade:shade`... ") - .getWithDefaultTimeout(); - } catch (TimeoutException | ExecutionException ignored) { - } - - File updateDir = new File("update/FredBoat"); - - Process mvnBuild = rt.exec("mvn -f " + updateDir.getAbsolutePath() + "/pom.xml package shade:shade"); - new SLF4JInputStreamLogger(log, mvnBuild.getInputStream()).start(); - new SLF4JInputStreamErrorLogger(log, mvnBuild.getInputStream()).start(); - - if (!mvnBuild.waitFor(600, TimeUnit.SECONDS)) { - CentralMessaging.editMessage(status, status.getRawContent() + "[:anger: timed out]\n\n"); - throw new RuntimeException("Operation timed out: mvn package shade:shade"); - } else if (mvnBuild.exitValue() != 0) { - CentralMessaging.editMessage(status, - status.getRawContent() + "[:anger: returned code " + mvnBuild.exitValue() + "]\n\n"); - throw new RuntimeException("Bad response code"); - } - - CentralMessaging.editMessage(status, status.getRawContent() + "👌🏽"); - - if (!new File("./update/FredBoat/target/FredBoat-1.0.jar").renameTo(new File(System.getProperty("user.home") + "/FredBoat-1.0.jar"))) { - throw new RuntimeException("Failed to move jar to home"); - } - } catch (InterruptedException | IOException ex) { - throw new RuntimeException(ex); - } - } - - @Nonnull - @Override - public String help(@Nonnull Context context) { - return "{0}{1} [branch [repo]]\n#Update the bot by checking out the provided branch from the provided github repo and compiling it. Default github repo is Frederikam, default branch is master. Does not restart the bot."; - } - - @Nonnull - @Override - public PermissionLevel getMinimumPerms() { - return PermissionLevel.BOT_OWNER; - } -} diff --git a/FredBoat/src/main/java/fredboat/command/admin/DisableCommandsCommand.java b/FredBoat/src/main/java/fredboat/command/admin/DisableCommandsCommand.java new file mode 100644 index 000000000..fab04fb67 --- /dev/null +++ b/FredBoat/src/main/java/fredboat/command/admin/DisableCommandsCommand.java @@ -0,0 +1,84 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.command.admin; + +import fredboat.command.info.HelpCommand; +import fredboat.commandmeta.CommandManager; +import fredboat.commandmeta.CommandRegistry; +import fredboat.commandmeta.abs.Command; +import fredboat.commandmeta.abs.CommandContext; +import fredboat.commandmeta.abs.ICommandRestricted; +import fredboat.messaging.internal.Context; +import fredboat.perms.PermissionLevel; + +import javax.annotation.Nonnull; + +public class DisableCommandsCommand extends Command implements ICommandRestricted { + + public DisableCommandsCommand(String name, String... aliases) { + super(name, aliases); + } + + @Override + public void onInvoke(@Nonnull CommandContext context) { + + if (context.hasArguments()) { + Command command = CommandRegistry.findCommand(context.args[0]); + if (command == null) { + context.reply("This command doesn't exist!"); + return; + } + + if (command.name.equals("enable") + || command.name.equals("disable")) { + context.reply("Let's not disable this :wink:"); + return; + } + + if (CommandManager.disabledCommands.contains(command)) { + context.reply("This command is already disabled!"); + return; + } + + CommandManager.disabledCommands.add(command); + context.reply(":ok_hand: Command `" + command.name + "` disabled!"); + } else { + HelpCommand.sendFormattedCommandHelp(context); + } + } + + @Nonnull + @Override + public String help(@Nonnull Context context) { + return "{0}{1} \n#Disable a command GLOBALLY use with caution"; + } + + @Nonnull + @Override + public PermissionLevel getMinimumPerms() { + return PermissionLevel.BOT_ADMIN; + } +} diff --git a/FredBoat/src/main/java/fredboat/command/admin/DiscordPermissionCommand.java b/FredBoat/src/main/java/fredboat/command/admin/DiscordPermissionCommand.java new file mode 100644 index 000000000..ef5532b7a --- /dev/null +++ b/FredBoat/src/main/java/fredboat/command/admin/DiscordPermissionCommand.java @@ -0,0 +1,203 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.command.admin; + +import fredboat.FredBoat; +import fredboat.commandmeta.abs.Command; +import fredboat.commandmeta.abs.CommandContext; +import fredboat.commandmeta.abs.ICommandRestricted; +import fredboat.messaging.CentralMessaging; +import fredboat.messaging.internal.Context; +import fredboat.perms.PermissionLevel; +import fredboat.util.TextUtils; +import net.dv8tion.jda.core.EmbedBuilder; +import net.dv8tion.jda.core.Permission; +import net.dv8tion.jda.core.entities.Category; +import net.dv8tion.jda.core.entities.ChannelType; +import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.entities.Member; +import net.dv8tion.jda.core.entities.PermissionOverride; +import net.dv8tion.jda.core.entities.Role; +import net.dv8tion.jda.core.entities.TextChannel; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by napster on 18.01.18. + * + * This command is for debugging and FredBoat support staff. + */ +public class DiscordPermissionCommand extends Command implements ICommandRestricted { + + public DiscordPermissionCommand(@Nonnull String name, String... aliases) { + super(name, aliases); + } + + @Nonnull + @Override + public PermissionLevel getMinimumPerms() { + return PermissionLevel.BOT_ADMIN; + } + + @Nonnull + @Override + public String help(@Nonnull Context context) { + return "{0}{1} [channel id or mention] [user id or mention]\n#Show permissions of a user and any roles they " + + "have for a channel and guild. If no user is provided, FredBoat shows permissions for itself. If no " + + "channel is provided, permissions for the channel where the command is issued are shown."; + } + + @Override + public void onInvoke(@Nonnull CommandContext context) { + + TextChannel tc = context.channel; + + if (!context.msg.getMentionedChannels().isEmpty()) { + tc = context.msg.getMentionedChannels().get(0); + } else if (context.hasArguments()) { + try { + long channelId = Long.parseUnsignedLong(context.args[0]); + TextChannel textChannel = FredBoat.getTextChannelById(channelId); + if (textChannel == null) { + context.reply(String.format("No text channel with id `%s` found.", channelId)); + return; + } + tc = textChannel; + } catch (NumberFormatException ignored) { + } + } + Guild guild = tc.getGuild(); + + + Member member = guild.getSelfMember(); + if (!context.getMentionedUsers().isEmpty()) { + Member m = guild.getMember(context.getMentionedUsers().get(0)); + if (m != null) { + member = m; + } + } else if (context.args.length > 1) { + try { + long userId = Long.parseUnsignedLong(context.args[1]); + Member m = guild.getMemberById(userId); + if (m == null) { + context.reply("No member with id `%s` found in the specified guild."); + return; + } + member = m; + } catch (NumberFormatException ignored) { + } + } + + + //we need the following things: + // server permissions for all roles of the member, including the @everyone role + // category overrides for roles + @everyone + // category override for member + // channel overrides for roles + @everyone + // channel override for member + + EmbedBuilder eb = CentralMessaging.getColoredEmbedBuilder(); + eb.setTitle("Full allowed/denied discord permissions"); + eb.setDescription("Empty roles / permission overrides omitted."); + + String userStr = member.getAsMention() + + "\n" + member.getUser().getIdLong() + + "\n" + TextUtils.escapeMarkdown(member.getEffectiveName()) + + "\n" + TextUtils.escapeMarkdown(member.getUser().getName()); + String guildStr = TextUtils.escapeMarkdown(guild.getName()) + + "\n" + guild.getIdLong(); + String channelStr = TextUtils.escapeMarkdown(tc.getName()) + + "\n" + tc.getIdLong(); + eb.addField("User", userStr, true); + eb.addField("Guild", guildStr, true); + eb.addField("Channel", channelStr, true); + + List roles = new ArrayList<>(member.getRoles()); + roles.add(guild.getPublicRole()); + + for (Role role : roles) { + StringBuilder roleField = new StringBuilder(); + if (!role.getPermissions().isEmpty()) { + for (Permission permission : role.getPermissions()) { + roleField.append("+ ").append(permission.name()).append("\n"); + } + eb.addField("Level: Server, Role: " + role.getName(), TextUtils.asCodeBlock(roleField.toString(), "diff"), false); + } + } + + Category category = tc.getParent(); + if (category == null) { + eb.addField("No parent category", "", false); + } else { + for (Role role : roles) { + formatPermissionOverride(eb, category.getPermissionOverride(role)); + } + formatPermissionOverride(eb, category.getPermissionOverride(member)); + } + + for (Role role : roles) { + formatPermissionOverride(eb, tc.getPermissionOverride(role)); + } + formatPermissionOverride(eb, tc.getPermissionOverride(member)); + + context.reply(eb.build()); + } + + //add formatted information about a permission override to the embed builder, if there is any + private static void formatPermissionOverride(@Nonnull EmbedBuilder eb, @Nullable PermissionOverride po) { + if (po == null) { + return; + } + if (po.getAllowed().isEmpty() && po.getDenied().isEmpty()) { + return; + } + + String name = "Level: " + (po.getChannel().getType() == ChannelType.CATEGORY ? "Category" : "Channel"); + name += ", "; + Role role = po.getRole(); + if (role != null) { + name += "Role: " + role.getName(); + } else { + name += "Self Member"; + } + + eb.addField(name, permOverrideAsDiffMarkdown(po), false); + } + + private static String permOverrideAsDiffMarkdown(@Nonnull PermissionOverride override) { + StringBuilder sb = new StringBuilder(); + for (Permission permission : override.getAllowed()) { + sb.append("+ ").append(permission.name()).append("\n"); + } + for (Permission permission : override.getDenied()) { + sb.append("- ").append(permission.name()).append("\n"); + } + return TextUtils.asCodeBlock(sb.toString(), "diff"); + } +} diff --git a/FredBoat/src/main/java/fredboat/command/admin/EnableCommandsCommand.java b/FredBoat/src/main/java/fredboat/command/admin/EnableCommandsCommand.java new file mode 100644 index 000000000..ffd089e28 --- /dev/null +++ b/FredBoat/src/main/java/fredboat/command/admin/EnableCommandsCommand.java @@ -0,0 +1,77 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.command.admin; + +import fredboat.command.info.HelpCommand; +import fredboat.commandmeta.CommandManager; +import fredboat.commandmeta.CommandRegistry; +import fredboat.commandmeta.abs.Command; +import fredboat.commandmeta.abs.CommandContext; +import fredboat.commandmeta.abs.ICommandRestricted; +import fredboat.messaging.internal.Context; +import fredboat.perms.PermissionLevel; + +import javax.annotation.Nonnull; + +public class EnableCommandsCommand extends Command implements ICommandRestricted { + + public EnableCommandsCommand(String name, String... aliases) { + super(name, aliases); + } + + @Override + public void onInvoke(@Nonnull CommandContext context) { + + if (context.hasArguments()) { + Command command = CommandRegistry.findCommand(context.args[0]); + if (command == null) { + context.reply("This command doesn't exist!"); + return; + } + + if (CommandManager.disabledCommands.contains(command)) { + CommandManager.disabledCommands.remove(command); + context.reply(":ok_hand: Command `" + command.name + "` enabled!"); + return; + } + context.reply("This command is not disabled!"); + } else { + HelpCommand.sendFormattedCommandHelp(context); + } + } + + @Nonnull + @Override + public String help(@Nonnull Context context) { + return "{0}{1} \n#Re-enable a globally disabled command"; + } + + @Nonnull + @Override + public PermissionLevel getMinimumPerms() { + return PermissionLevel.BOT_ADMIN; + } +} diff --git a/FredBoat/src/main/java/fredboat/command/admin/ExitCommand.java b/FredBoat/src/main/java/fredboat/command/admin/ExitCommand.java index 80b5945dc..8dd490173 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/ExitCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/ExitCommand.java @@ -32,6 +32,7 @@ import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; import fredboat.shared.constant.ExitCodes; +import fredboat.util.TextUtils; import javax.annotation.Nonnull; import java.util.concurrent.ExecutionException; @@ -47,20 +48,34 @@ public ExitCommand(String name, String... aliases) { super(name, aliases); } + @Nonnull + private String code = TextUtils.randomAlphaNumericString(4); + @Override public void onInvoke(@Nonnull CommandContext context) { - - try { - context.replyWithName(":wave:").getWithDefaultTimeout(); - } catch (InterruptedException | ExecutionException | TimeoutException ignored) { + if (context.hasArguments()) { + if (context.rawArgs.equals(code)) { + try { + context.replyWithName(":wave:").getWithDefaultTimeout(); + } catch (InterruptedException | ExecutionException | TimeoutException ignored) { + } + FredBoat.shutdown(ExitCodes.EXIT_CODE_NORMAL); + return; + } else { + context.reply(String.format("Your input `%s` did not fit the required code `%s`. A new code will be issued.", + TextUtils.escapeMarkdown(context.rawArgs), code)); + } } - FredBoat.shutdown(ExitCodes.EXIT_CODE_NORMAL); + + code = TextUtils.randomAlphaNumericString(4); + context.reply(String.format("This will **shut down the whole bot**. " + + "Please confirm by issuing this command again, with the following confirmation code appended: `%s`", code)); } @Nonnull @Override public String help(@Nonnull Context context) { - return "{0}{1}\n#Shut down the bot."; + return "{0}{1} [code]\n#Shut down the bot."; } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/admin/LeaveServerCommand.java b/FredBoat/src/main/java/fredboat/command/admin/LeaveServerCommand.java index 3fc8f5eab..9ac740963 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/LeaveServerCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/LeaveServerCommand.java @@ -25,22 +25,16 @@ package fredboat.command.admin; -import fredboat.FredBoat; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; - -import net.dv8tion.jda.core.requests.RestAction; import net.dv8tion.jda.core.entities.Message; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nonnull; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeoutException; import java.util.function.Consumer; diff --git a/FredBoat/src/main/java/fredboat/command/admin/MavenTestCommand.java b/FredBoat/src/main/java/fredboat/command/admin/MavenTestCommand.java deleted file mode 100644 index a1fbec53c..000000000 --- a/FredBoat/src/main/java/fredboat/command/admin/MavenTestCommand.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Frederik Ar. Mikkelsen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package fredboat.command.admin; - -import fredboat.commandmeta.abs.Command; -import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.messaging.CentralMessaging; -import fredboat.messaging.internal.Context; -import fredboat.perms.PermissionLevel; -import fredboat.util.log.SLF4JInputStreamErrorLogger; -import fredboat.util.log.SLF4JInputStreamLogger; -import net.dv8tion.jda.core.entities.Message; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nonnull; -import java.io.File; -import java.io.IOException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -/** - * Created by napster on 23.03.17. - *

- * Attempts to run the "mvn test" command on the bots present sources. - */ -@Deprecated //we dont use maven anymore. todo decide if can be repurposed for gradle -public class MavenTestCommand extends Command implements ICommandRestricted { - - private static final Logger log = LoggerFactory.getLogger(MavenTestCommand.class); - - public MavenTestCommand(String name, String... aliases) { - super(name, aliases); - } - - @Override - public void onInvoke(@Nonnull CommandContext context) { - context.reply("*Testing now...*", - status -> mavenTest(context, status) - ); - } - - private void mavenTest(CommandContext context, Message status) { - try { - Runtime rt = Runtime.getRuntime(); - - try { - CentralMessaging.editMessage(status, status.getRawContent() + "\n\nRunning `mvn test`... ") - .getWithDefaultTimeout(); - } catch (TimeoutException | ExecutionException ignored) { - } - File pom = new File("FredBoat/pom.xml"); - if (!pom.exists()) pom = new File("pom.xml"); - if (!pom.exists()) { - CentralMessaging.editMessage(status, status.getRawContent() + "[:anger: could not locate pom.xml:]\n\n"); - throw new RuntimeException("Could not locate file: pom.xml"); - } - - String pomPath = pom.getAbsolutePath(); - Process mvnBuild = rt.exec("mvn -f " + pomPath + " test"); - new SLF4JInputStreamLogger(log, mvnBuild.getInputStream()).start(); - new SLF4JInputStreamErrorLogger(log, mvnBuild.getInputStream()).start(); - - if (!mvnBuild.waitFor(600, TimeUnit.SECONDS)) { - CentralMessaging.editMessage(status, status.getRawContent() + "[:anger: timed out]\n\n"); - throw new RuntimeException("Operation timed out: mvn test"); - } else if (mvnBuild.exitValue() != 0) { - CentralMessaging.editMessage(status, - status.getRawContent() + "[:anger: returned code " + mvnBuild.exitValue() + "]\n\n"); - throw new RuntimeException("Bad response code"); - } - - CentralMessaging.editMessage(status, status.getRawContent() + "👌🏽"); - - } catch (InterruptedException | IOException ex) { - ex.printStackTrace(); - throw new RuntimeException(ex); - } - } - - @Nonnull - @Override - public String help(@Nonnull Context context) { - return "{0}{1}\n#Run 'mvn test' on the bots present sources."; - } - - @Nonnull - @Override - public PermissionLevel getMinimumPerms() { - return PermissionLevel.BOT_OWNER; - } -} diff --git a/FredBoat/src/main/java/fredboat/command/admin/NodeAdminCommand.java b/FredBoat/src/main/java/fredboat/command/admin/NodeAdminCommand.java index b29d9a45d..1b08bb2a2 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/NodeAdminCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/NodeAdminCommand.java @@ -26,7 +26,7 @@ package fredboat.command.admin; import fredboat.audio.player.LavalinkManager; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; @@ -47,6 +47,7 @@ public NodeAdminCommand(String name, String... aliases) { public void onInvoke(@Nonnull CommandContext context) { if (!LavalinkManager.ins.isEnabled()) { context.reply("Lavalink is disabled"); + return; } if (!context.hasArguments()) { HelpCommand.sendFormattedCommandHelp(context); diff --git a/FredBoat/src/main/java/fredboat/command/admin/PlayerDebugCommand.java b/FredBoat/src/main/java/fredboat/command/admin/PlayerDebugCommand.java index 716dd50f9..669d1f913 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/PlayerDebugCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/PlayerDebugCommand.java @@ -78,7 +78,7 @@ public void onInvoke(@Nonnull CommandContext context) { @Nonnull @Override public String help(@Nonnull Context context) { - return "{0}{1}\n#Show debug information about the music player of this guild."; + return "{0}{1}\n#Show debug information about all music players of this bot."; } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/admin/ReviveCommand.java b/FredBoat/src/main/java/fredboat/command/admin/ReviveCommand.java index 24073587b..25a9d11be 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/ReviveCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/ReviveCommand.java @@ -27,7 +27,7 @@ import fredboat.Config; import fredboat.FredBoat; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; diff --git a/FredBoat/src/main/java/fredboat/command/admin/SentryDsnCommand.java b/FredBoat/src/main/java/fredboat/command/admin/SentryDsnCommand.java index 2a05d72b8..225603fd9 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/SentryDsnCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/SentryDsnCommand.java @@ -28,7 +28,7 @@ import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.filter.ThresholdFilter; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; diff --git a/FredBoat/src/main/java/fredboat/command/admin/SetAvatarCommand.java b/FredBoat/src/main/java/fredboat/command/admin/SetAvatarCommand.java index 9561895ca..12c035a05 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/SetAvatarCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/SetAvatarCommand.java @@ -1,6 +1,6 @@ package fredboat.command.admin; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; diff --git a/FredBoat/src/main/java/fredboat/command/admin/UnblacklistCommand.java b/FredBoat/src/main/java/fredboat/command/admin/UnblacklistCommand.java index c020c4913..62a9d5440 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/UnblacklistCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/UnblacklistCommand.java @@ -24,7 +24,7 @@ package fredboat.command.admin; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; diff --git a/FredBoat/src/main/java/fredboat/command/admin/UpdateCommand.java b/FredBoat/src/main/java/fredboat/command/admin/UpdateCommand.java deleted file mode 100644 index 29e30556d..000000000 --- a/FredBoat/src/main/java/fredboat/command/admin/UpdateCommand.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Frederik Ar. Mikkelsen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -package fredboat.command.admin; - -import fredboat.FredBoat; -import fredboat.commandmeta.abs.Command; -import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.messaging.internal.Context; -import fredboat.perms.PermissionLevel; -import fredboat.shared.constant.ExitCodes; -import org.apache.commons.io.FileUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nonnull; -import java.io.File; -import java.io.IOException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeoutException; - -@Deprecated //we dont use maven anymore. todo decide if can be repurposed for gradle / downloads from CI server -public class UpdateCommand extends Command implements ICommandRestricted { - - private static final Logger log = LoggerFactory.getLogger(UpdateCommand.class); - private static final CompileCommand COMPILE_COMMAND = new CompileCommand(""); - private static final long MAX_JAR_AGE = 10 * 60 * 1000; - - public UpdateCommand(String name, String... aliases) { - super(name, aliases); - } - - @Override - public void onInvoke(@Nonnull CommandContext context) { - try { - File homeJar = new File(System.getProperty("user.home") + "/FredBoat-1.0.jar"); - - //Must exist and not be too old - if(homeJar.exists() - && (System.currentTimeMillis() - homeJar.lastModified()) < MAX_JAR_AGE){ - update(context); - return; - } else { - log.info(""); - } - - COMPILE_COMMAND.onInvoke(context); - - update(context); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private void update(CommandContext context) throws IOException { - File homeJar = new File(System.getProperty("user.home") + "/FredBoat-1.0.jar"); - File targetJar = new File("./update/target/FredBoat-1.0.jar"); - - targetJar.getParentFile().mkdirs(); - targetJar.delete(); - FileUtils.copyFile(homeJar, targetJar); - - //Shutdown for update - try { - context.reply("Now restarting...").getWithDefaultTimeout(); - } catch (TimeoutException | InterruptedException | ExecutionException ignored) { - } - FredBoat.shutdown(ExitCodes.EXIT_CODE_UPDATE); - } - - @Nonnull - @Override - public String help(@Nonnull Context context) { - return "{0}{1} [branch [repo]]\n#Update the bot by checking out the provided branch from the provided github repo and compiling it. Default github repo is Frederikam, default branch is master. Restart with the fresh build."; - } - - @Nonnull - @Override - public PermissionLevel getMinimumPerms() { - return PermissionLevel.BOT_OWNER; - } -} diff --git a/FredBoat/src/main/java/fredboat/command/moderation/ConfigCommand.java b/FredBoat/src/main/java/fredboat/command/config/ConfigCommand.java similarity index 91% rename from FredBoat/src/main/java/fredboat/command/moderation/ConfigCommand.java rename to FredBoat/src/main/java/fredboat/command/config/ConfigCommand.java index 1302cc881..605a18b3e 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/ConfigCommand.java +++ b/FredBoat/src/main/java/fredboat/command/config/ConfigCommand.java @@ -23,13 +23,13 @@ * */ -package fredboat.command.moderation; +package fredboat.command.config; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.commandmeta.abs.IModerationCommand; +import fredboat.commandmeta.abs.IConfigCommand; import fredboat.db.EntityReader; import fredboat.db.EntityWriter; import fredboat.db.entity.main.GuildConfig; @@ -43,7 +43,7 @@ import javax.annotation.Nonnull; -public class ConfigCommand extends Command implements IModerationCommand, ICommandRestricted { +public class ConfigCommand extends Command implements IConfigCommand, ICommandRestricted { public ConfigCommand(String name, String... aliases) { super(name, aliases); @@ -92,7 +92,7 @@ private void setConfig(CommandContext context) { EntityWriter.mergeGuildConfig(gc); context.replyWithName("`track_announce` " + context.i18nFormat("configSetTo", val)); } else { - context.reply(context.i18nFormat("configMustBeBoolean", TextUtils.escapeMarkdown(invoker.getEffectiveName()))); + context.reply(context.i18nFormat("configMustBeBoolean", TextUtils.escapeAndDefuse(invoker.getEffectiveName()))); } break; case "auto_resume": @@ -101,11 +101,11 @@ private void setConfig(CommandContext context) { EntityWriter.mergeGuildConfig(gc); context.replyWithName("`auto_resume` " + context.i18nFormat("configSetTo", val)); } else { - context.reply(context.i18nFormat("configMustBeBoolean", TextUtils.escapeMarkdown(invoker.getEffectiveName()))); + context.reply(context.i18nFormat("configMustBeBoolean", TextUtils.escapeAndDefuse(invoker.getEffectiveName()))); } break; default: - context.reply(context.i18nFormat("configUnknownKey", TextUtils.escapeMarkdown(invoker.getEffectiveName()))); + context.reply(context.i18nFormat("configUnknownKey", TextUtils.escapeAndDefuse(invoker.getEffectiveName()))); break; } } diff --git a/FredBoat/src/main/java/fredboat/command/moderation/LanguageCommand.java b/FredBoat/src/main/java/fredboat/command/config/LanguageCommand.java similarity index 95% rename from FredBoat/src/main/java/fredboat/command/moderation/LanguageCommand.java rename to FredBoat/src/main/java/fredboat/command/config/LanguageCommand.java index f63ca7f47..5538be3f2 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/LanguageCommand.java +++ b/FredBoat/src/main/java/fredboat/command/config/LanguageCommand.java @@ -23,12 +23,12 @@ * */ -package fredboat.command.moderation; +package fredboat.command.config; import fredboat.Config; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IModerationCommand; +import fredboat.commandmeta.abs.IConfigCommand; import fredboat.feature.I18n; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; @@ -43,7 +43,7 @@ import java.util.Collections; import java.util.List; -public class LanguageCommand extends Command implements IModerationCommand { +public class LanguageCommand extends Command implements IConfigCommand { public LanguageCommand(String name, String... aliases) { super(name, aliases); diff --git a/FredBoat/src/main/java/fredboat/command/config/ModulesCommand.java b/FredBoat/src/main/java/fredboat/command/config/ModulesCommand.java new file mode 100644 index 000000000..87d29067d --- /dev/null +++ b/FredBoat/src/main/java/fredboat/command/config/ModulesCommand.java @@ -0,0 +1,156 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.command.config; + +import fredboat.FredBoat; +import fredboat.command.info.HelpCommand; +import fredboat.commandmeta.CommandInitializer; +import fredboat.commandmeta.CommandRegistry; +import fredboat.commandmeta.abs.Command; +import fredboat.commandmeta.abs.CommandContext; +import fredboat.commandmeta.abs.IConfigCommand; +import fredboat.db.entity.main.GuildModules; +import fredboat.messaging.CentralMessaging; +import fredboat.messaging.internal.Context; +import fredboat.perms.PermissionLevel; +import fredboat.perms.PermsUtil; +import fredboat.util.Emojis; + +import javax.annotation.Nonnull; +import java.util.function.Function; + +import static fredboat.util.AsciiArtConstant.MAGICAL_LENNY; + +/** + * Created by napster on 09.11.17. + *

+ * Turn modules on and off + */ +public class ModulesCommand extends Command implements IConfigCommand { + + public ModulesCommand(@Nonnull String name, String... aliases) { + super(name, aliases); + } + + private static final String ENABLE = "enable"; + private static final String DISABLE = "disable"; + + @Override + public void onInvoke(@Nonnull CommandContext context) { + + if (!context.hasArguments()) { + displayModuleStatus(context); + return; + } + if (!PermsUtil.checkPermsWithFeedback(PermissionLevel.ADMIN, context)) { + return; + } + + //editing module status happens here + + String args = context.rawArgs.toLowerCase(); + + boolean enable; + if (args.contains("enable")) { + enable = true; + } else if (args.contains("disable")) { + enable = false; + } else { + HelpCommand.sendFormattedCommandHelp(context); + return; + } + + CommandRegistry.Module module = CommandRegistry.Module.which(args, context); + if (module == null) { + context.reply(context.i18nFormat("moduleCantParse", + context.getPrefix() + context.command.name)); + return; + } else if (module.lockedModule) { + context.reply(context.i18nFormat("moduleLocked", context.i18n(module.translationKey)) + + "\n" + MAGICAL_LENNY); + return; + } + + Function transform; + if (enable) { + transform = gm -> gm.enableModule(module); + context.reply(context.i18nFormat("moduleEnable", "**" + context.i18n(module.translationKey) + "**") + + "\n" + context.i18nFormat("moduleShowCommands", + "`" + context.getPrefix() + CommandInitializer.COMMANDS_COMM_NAME + + " " + context.i18n(module.translationKey) + "`") + ); + } else { + transform = gm -> gm.disableModule(module); + context.reply(context.i18nFormat("moduleDisable", "**" + context.i18n(module.translationKey) + "**")); + } + + FredBoat.getMainDbWrapper().findApplyAndMerge(GuildModules.key(context.guild), transform); + } + + private static void displayModuleStatus(@Nonnull CommandContext context) { + GuildModules gm = FredBoat.getMainDbWrapper().getOrCreate(GuildModules.key(context.guild)); + Function moduleStatusFormatter = moduleStatusLine(gm, context); + String moduleStatus = ""; + + if (PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, context.invoker)) { + moduleStatus + = moduleStatusFormatter.apply(CommandRegistry.Module.ADMIN) + " " + Emojis.LOCK + "\n" + + moduleStatusFormatter.apply(CommandRegistry.Module.INFO) + " " + Emojis.LOCK + "\n" + + moduleStatusFormatter.apply(CommandRegistry.Module.CONFIG) + " " + Emojis.LOCK + "\n" + ; + } + + moduleStatus + += moduleStatusFormatter.apply(CommandRegistry.Module.MUSIC) + " " + Emojis.LOCK + "\n" + + moduleStatusFormatter.apply(CommandRegistry.Module.MOD) + "\n" + + moduleStatusFormatter.apply(CommandRegistry.Module.UTIL) + "\n" + + moduleStatusFormatter.apply(CommandRegistry.Module.FUN) + "\n" + ; + + String howto = "`" + context.getPrefix() + CommandInitializer.MODULES_COMM_NAME + " " + ENABLE + "/" + DISABLE + " `"; + context.reply(CentralMessaging.getColoredEmbedBuilder() + .addField(context.i18n("moduleStatus"), moduleStatus, false) + .addField("", context.i18nFormat("modulesHowTo", howto), false) + .build() + ); + } + + @Nonnull + //nicely format modules for displaying to users + private static Function moduleStatusLine(@Nonnull GuildModules gm, @Nonnull Context context) { + return (module) -> (gm.isModuleEnabled(module, module.enabledByDefault) ? Emojis.OK : Emojis.BAD) + + module.emoji + + " " + + context.i18n(module.translationKey); + } + + @Nonnull + @Override + public String help(@Nonnull Context context) { + String usage = "{0}{1} OR {0}{1} enable/disable \n#"; + return usage + context.i18n("helpModules"); + } +} diff --git a/FredBoat/src/main/java/fredboat/command/moderation/PermissionsCommand.java b/FredBoat/src/main/java/fredboat/command/config/PermissionsCommand.java similarity index 93% rename from FredBoat/src/main/java/fredboat/command/moderation/PermissionsCommand.java rename to FredBoat/src/main/java/fredboat/command/config/PermissionsCommand.java index 8717b08ce..c82027e77 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/PermissionsCommand.java +++ b/FredBoat/src/main/java/fredboat/command/config/PermissionsCommand.java @@ -23,12 +23,12 @@ * */ -package fredboat.command.moderation; +package fredboat.command.config; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IModerationCommand; +import fredboat.commandmeta.abs.IConfigCommand; import fredboat.db.EntityReader; import fredboat.db.EntityWriter; import fredboat.db.entity.main.GuildPermissions; @@ -42,22 +42,13 @@ import fredboat.util.TextUtils; import net.dv8tion.jda.core.EmbedBuilder; import net.dv8tion.jda.core.Permission; -import net.dv8tion.jda.core.entities.Guild; -import net.dv8tion.jda.core.entities.IMentionable; -import net.dv8tion.jda.core.entities.ISnowflake; -import net.dv8tion.jda.core.entities.Member; -import net.dv8tion.jda.core.entities.Role; -import net.dv8tion.jda.core.utils.PermissionUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import net.dv8tion.jda.core.entities.*; import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; -public class PermissionsCommand extends Command implements IModerationCommand { - - private static final Logger log = LoggerFactory.getLogger(PermissionsCommand.class); +public class PermissionsCommand extends Command implements IConfigCommand { public final PermissionLevel permissionLevel; @@ -136,7 +127,7 @@ public void remove(CommandContext context) { if (permissionLevel == PermissionLevel.ADMIN && PermissionLevel.BOT_ADMIN.getLevel() > PermsUtil.getPerms(invoker).getLevel() - && !PermissionUtil.checkPermission(invoker, Permission.ADMINISTRATOR) + && !invoker.hasPermission(Permission.ADMINISTRATOR) && !PermsUtil.checkList(newList, invoker)) { context.replyWithName(context.i18n("permsFailSelfDemotion")); return; diff --git a/FredBoat/src/main/java/fredboat/command/moderation/PrefixCommand.java b/FredBoat/src/main/java/fredboat/command/config/PrefixCommand.java similarity index 70% rename from FredBoat/src/main/java/fredboat/command/moderation/PrefixCommand.java rename to FredBoat/src/main/java/fredboat/command/config/PrefixCommand.java index 497c683a9..cec86e02d 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/PrefixCommand.java +++ b/FredBoat/src/main/java/fredboat/command/config/PrefixCommand.java @@ -23,25 +23,23 @@ * SOFTWARE. */ -package fredboat.command.moderation; +package fredboat.command.config; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import fredboat.Config; import fredboat.FredBoat; -import fredboat.command.fun.RandomImageCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IModerationCommand; -import fredboat.db.EntityReader; -import fredboat.db.EntityWriter; -import fredboat.db.entity.main.GuildConfig; +import fredboat.commandmeta.abs.IConfigCommand; +import fredboat.db.entity.main.Prefix; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; import fredboat.perms.PermsUtil; -import fredboat.shared.constant.BotConstants; +import fredboat.util.DiscordUtil; import fredboat.util.TextUtils; +import fredboat.util.rest.CacheUtil; import net.dv8tion.jda.core.entities.Guild; import javax.annotation.Nonnull; @@ -52,14 +50,13 @@ /** * Created by napster on 19.10.17. */ -public class PrefixCommand extends Command implements IModerationCommand { - - private static final RandomImageCommand wombats = new RandomImageCommand("https://imgur.com/a/mnhzS", ""); +public class PrefixCommand extends Command implements IConfigCommand { public PrefixCommand(@Nonnull String name, String... aliases) { super(name, aliases); } + @SuppressWarnings("ConstantConditions") public static final LoadingCache> CUSTOM_PREFIXES = CacheBuilder.newBuilder() //it is fine to check the db for updates occasionally, as we currently dont have any use case where we change //the value saved there through other means. in case we add such a thing (like a dashboard), consider lowering @@ -69,12 +66,11 @@ public PrefixCommand(@Nonnull String name, String... aliases) { .refreshAfterWrite(1, TimeUnit.MINUTES) //NOTE: never use refreshing without async reloading, because Guavas cache uses the thread calling it to do cleanup tasks (including refreshing) .expireAfterAccess(1, TimeUnit.MINUTES) //evict inactive guilds .concurrencyLevel(Config.getNumShards()) //each shard has a thread (main JDA thread) accessing this cache many times - .build(CacheLoader.asyncReloading(CacheLoader.from(GuildConfig::getPrefix), FredBoat.executor)); + .build(CacheLoader.asyncReloading(CacheLoader.from(guildId -> Prefix.getPrefix(guildId, DiscordUtil.getBotId())), FredBoat.executor)); @Nonnull private static String giefPrefix(long guildId) { - return CUSTOM_PREFIXES - .getUnchecked(guildId) + return CacheUtil.getUncheckedUnwrapped(CUSTOM_PREFIXES, guildId) .orElse(Config.CONFIG.getPrefix()); } @@ -84,10 +80,6 @@ public static String giefPrefix(@Nullable Guild guild) { return Config.CONFIG.getPrefix(); } - if (guild.getJDA().getSelfUser().getIdLong() == BotConstants.PATRON_BOT_ID) { - return Config.CONFIG.getPrefix(); //todo lift this limitation after sorting out a data strategy - } - return giefPrefix(guild.getIdLong()); } @@ -103,31 +95,29 @@ public void onInvoke(@Nonnull CommandContext context) { return; } - if (context.guild.getJDA().getSelfUser().getIdLong() == BotConstants.PATRON_BOT_ID) { - context.reply("Sorry, this feature has not yet been enabled for the PatronBot! Have a picture of a wombat instead."); - wombats.onInvoke(context); - return; - //todo lift this limitation after sorting out a data strategy - } - - - //considering this is an admin level command, we can allow users to do whatever they want with their guild - // prefix, so no checks are necessary here - String newPrefix = context.rawArgs; - - if (newPrefix.equalsIgnoreCase("no_prefix")) { + final String newPrefix; + if (context.rawArgs.equalsIgnoreCase("no_prefix")) { newPrefix = ""; //allow users to set an empty prefix with a special keyword + } else if (context.rawArgs.equalsIgnoreCase("reset")) { + newPrefix = null; + } else { + //considering this is an admin level command, we can allow users to do whatever they want with their guild + // prefix, so no checks are necessary here + newPrefix = context.rawArgs; } - GuildConfig gf = EntityReader.getGuildConfig(context.guild.getId()); - gf.setPrefix(newPrefix); - EntityWriter.mergeGuildConfig(gf); + FredBoat.getMainDbWrapper().findApplyAndMerge(Prefix.key(context.guild), + prefixEntity -> prefixEntity.setPrefix(newPrefix)); //we could do a put instead of invalidate here and probably safe one lookup, but that undermines the database // as being the single source of truth for prefixes CUSTOM_PREFIXES.invalidate(context.guild.getIdLong()); - showPrefix(context, newPrefix); + if (newPrefix == null) {//was reset + showPrefix(context, Config.DEFAULT_PREFIX); + } else { + showPrefix(context, newPrefix); + } } public static void showPrefix(@Nonnull Context context, @Nonnull String prefix) { @@ -139,6 +129,6 @@ public static void showPrefix(@Nonnull Context context, @Nonnull String prefix) @Nonnull @Override public String help(@Nonnull Context context) { - return "{0}{1} OR {0}{1} no_prefix\n#" + context.i18n("helpPrefixCommand"); + return "{0}{1} OR {0}{1} no_prefix OR {0}{1} reset\n#" + context.i18n("helpPrefixCommand"); } } diff --git a/FredBoat/src/main/java/fredboat/command/fun/RiotCommand.java b/FredBoat/src/main/java/fredboat/command/fun/RiotCommand.java index a06fbedcf..b549578d6 100644 --- a/FredBoat/src/main/java/fredboat/command/fun/RiotCommand.java +++ b/FredBoat/src/main/java/fredboat/command/fun/RiotCommand.java @@ -41,7 +41,7 @@ public RiotCommand(String name, String... aliases) { @Override public void onInvoke(@Nonnull CommandContext context) { - context.reply("ヽ༼ຈل͜ຈ༽ノ **" + TextUtils.escapeMarkdown(context.rawArgs.toUpperCase()) + "** ヽ༼ຈل͜ຈ༽ノ"); + context.reply("ヽ༼ຈل͜ຈ༽ノ **" + TextUtils.escapeAndDefuse(context.rawArgs.toUpperCase()) + "** ヽ༼ຈل͜ຈ༽ノ"); } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/util/SayCommand.java b/FredBoat/src/main/java/fredboat/command/fun/SayCommand.java similarity index 91% rename from FredBoat/src/main/java/fredboat/command/util/SayCommand.java rename to FredBoat/src/main/java/fredboat/command/fun/SayCommand.java index 5cdb46f24..fb4146ac0 100644 --- a/FredBoat/src/main/java/fredboat/command/util/SayCommand.java +++ b/FredBoat/src/main/java/fredboat/command/fun/SayCommand.java @@ -22,11 +22,12 @@ * SOFTWARE. * */ -package fredboat.command.util; +package fredboat.command.fun; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IUtilCommand; +import fredboat.commandmeta.abs.IFunCommand; import fredboat.event.EventListenerBoat; import fredboat.messaging.internal.Context; import fredboat.util.TextUtils; @@ -37,7 +38,7 @@ * * @author frederik */ -public class SayCommand extends Command implements IUtilCommand { +public class SayCommand extends Command implements IFunCommand { public SayCommand(String name, String... aliases) { super(name, aliases); diff --git a/FredBoat/src/main/java/fredboat/command/fun/CatgirlCommand.java b/FredBoat/src/main/java/fredboat/command/fun/img/CatgirlCommand.java similarity index 98% rename from FredBoat/src/main/java/fredboat/command/fun/CatgirlCommand.java rename to FredBoat/src/main/java/fredboat/command/fun/img/CatgirlCommand.java index 3839e33cf..bc2c35c85 100644 --- a/FredBoat/src/main/java/fredboat/command/fun/CatgirlCommand.java +++ b/FredBoat/src/main/java/fredboat/command/fun/img/CatgirlCommand.java @@ -23,7 +23,7 @@ * */ -package fredboat.command.fun; +package fredboat.command.fun.img; import fredboat.FredBoat; import fredboat.commandmeta.abs.Command; diff --git a/FredBoat/src/main/java/fredboat/command/fun/FacedeskCommand.java b/FredBoat/src/main/java/fredboat/command/fun/img/FacedeskCommand.java similarity index 98% rename from FredBoat/src/main/java/fredboat/command/fun/FacedeskCommand.java rename to FredBoat/src/main/java/fredboat/command/fun/img/FacedeskCommand.java index 4a64bbf11..89de67dc5 100644 --- a/FredBoat/src/main/java/fredboat/command/fun/FacedeskCommand.java +++ b/FredBoat/src/main/java/fredboat/command/fun/img/FacedeskCommand.java @@ -23,7 +23,7 @@ * */ -package fredboat.command.fun; +package fredboat.command.fun.img; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IFunCommand; diff --git a/FredBoat/src/main/java/fredboat/command/fun/HugCommand.java b/FredBoat/src/main/java/fredboat/command/fun/img/HugCommand.java similarity index 98% rename from FredBoat/src/main/java/fredboat/command/fun/HugCommand.java rename to FredBoat/src/main/java/fredboat/command/fun/img/HugCommand.java index 80ebed2f1..99f305b09 100644 --- a/FredBoat/src/main/java/fredboat/command/fun/HugCommand.java +++ b/FredBoat/src/main/java/fredboat/command/fun/img/HugCommand.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package fredboat.command.fun; +package fredboat.command.fun.img; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IFunCommand; diff --git a/FredBoat/src/main/java/fredboat/command/fun/PatCommand.java b/FredBoat/src/main/java/fredboat/command/fun/img/PatCommand.java similarity index 98% rename from FredBoat/src/main/java/fredboat/command/fun/PatCommand.java rename to FredBoat/src/main/java/fredboat/command/fun/img/PatCommand.java index 1ff9bcc0b..403607a77 100644 --- a/FredBoat/src/main/java/fredboat/command/fun/PatCommand.java +++ b/FredBoat/src/main/java/fredboat/command/fun/img/PatCommand.java @@ -23,7 +23,7 @@ * */ -package fredboat.command.fun; +package fredboat.command.fun.img; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IFunCommand; diff --git a/FredBoat/src/main/java/fredboat/command/fun/RandomImageCommand.java b/FredBoat/src/main/java/fredboat/command/fun/img/RandomImageCommand.java similarity index 99% rename from FredBoat/src/main/java/fredboat/command/fun/RandomImageCommand.java rename to FredBoat/src/main/java/fredboat/command/fun/img/RandomImageCommand.java index b9bf06e80..82fd1ce22 100644 --- a/FredBoat/src/main/java/fredboat/command/fun/RandomImageCommand.java +++ b/FredBoat/src/main/java/fredboat/command/fun/img/RandomImageCommand.java @@ -23,7 +23,7 @@ * */ -package fredboat.command.fun; +package fredboat.command.fun.img; import fredboat.Config; import fredboat.commandmeta.abs.Command; diff --git a/FredBoat/src/main/java/fredboat/command/fun/RemoteFileCommand.java b/FredBoat/src/main/java/fredboat/command/fun/img/RemoteFileCommand.java similarity index 89% rename from FredBoat/src/main/java/fredboat/command/fun/RemoteFileCommand.java rename to FredBoat/src/main/java/fredboat/command/fun/img/RemoteFileCommand.java index 2353d0542..cca657520 100644 --- a/FredBoat/src/main/java/fredboat/command/fun/RemoteFileCommand.java +++ b/FredBoat/src/main/java/fredboat/command/fun/img/RemoteFileCommand.java @@ -23,13 +23,12 @@ * */ -package fredboat.command.fun; +package fredboat.command.fun.img; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IFunCommand; import fredboat.messaging.internal.Context; -import fredboat.util.rest.CacheUtil; import javax.annotation.Nonnull; @@ -44,8 +43,7 @@ public RemoteFileCommand(String url, String name, String... aliases) { @Override public void onInvoke(@Nonnull CommandContext context) { - //NOTE: moving this to Context#replyImage breaks the ;;gif one - context.replyFile(CacheUtil.getImageFromURL(url), null); + context.replyImage(url, null); } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/fun/img/RestrictedRemoteFileCommand.java b/FredBoat/src/main/java/fredboat/command/fun/img/RestrictedRemoteFileCommand.java new file mode 100644 index 000000000..e3236c4e4 --- /dev/null +++ b/FredBoat/src/main/java/fredboat/command/fun/img/RestrictedRemoteFileCommand.java @@ -0,0 +1,51 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.command.fun.img; + +import fredboat.commandmeta.abs.ICommandRestricted; +import fredboat.perms.PermissionLevel; + +import javax.annotation.Nonnull; + +/** + * Created by napster on 22.01.18. + */ +public class RestrictedRemoteFileCommand extends RemoteFileCommand implements ICommandRestricted { + + @Nonnull + private final PermissionLevel permissionLevel; + + public RestrictedRemoteFileCommand(@Nonnull PermissionLevel permissionLevel, String url, String name, String... aliases) { + super(url, name, aliases); + this.permissionLevel = permissionLevel; + } + + @Nonnull + @Override + public PermissionLevel getMinimumPerms() { + return permissionLevel; + } +} diff --git a/FredBoat/src/main/java/fredboat/command/fun/RollCommand.java b/FredBoat/src/main/java/fredboat/command/fun/img/RollCommand.java similarity index 98% rename from FredBoat/src/main/java/fredboat/command/fun/RollCommand.java rename to FredBoat/src/main/java/fredboat/command/fun/img/RollCommand.java index 65846592d..230d52d48 100644 --- a/FredBoat/src/main/java/fredboat/command/fun/RollCommand.java +++ b/FredBoat/src/main/java/fredboat/command/fun/img/RollCommand.java @@ -23,7 +23,7 @@ * */ -package fredboat.command.fun; +package fredboat.command.fun.img; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IFunCommand; diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/AudioDebugCommand.java b/FredBoat/src/main/java/fredboat/command/info/AudioDebugCommand.java similarity index 94% rename from FredBoat/src/main/java/fredboat/command/maintenance/AudioDebugCommand.java rename to FredBoat/src/main/java/fredboat/command/info/AudioDebugCommand.java index abaed58c4..46a467c1b 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/AudioDebugCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/AudioDebugCommand.java @@ -23,7 +23,7 @@ * */ -package fredboat.command.maintenance; +package fredboat.command.info; import fredboat.audio.player.AudioLossCounter; import fredboat.audio.player.GuildPlayer; @@ -31,14 +31,14 @@ import fredboat.audio.player.PlayerRegistry; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.internal.Context; import fredboat.util.TextUtils; import javax.annotation.Nonnull; -public class AudioDebugCommand extends Command implements IMaintenanceCommand { +public class AudioDebugCommand extends Command implements IInfoCommand { public AudioDebugCommand(String name, String... aliases) { super(name, aliases); diff --git a/FredBoat/src/main/java/fredboat/command/info/CommandsCommand.java b/FredBoat/src/main/java/fredboat/command/info/CommandsCommand.java new file mode 100644 index 000000000..63743598d --- /dev/null +++ b/FredBoat/src/main/java/fredboat/command/info/CommandsCommand.java @@ -0,0 +1,165 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.command.info; + +import fredboat.command.music.control.DestroyCommand; +import fredboat.commandmeta.CommandInitializer; +import fredboat.commandmeta.CommandRegistry; +import fredboat.commandmeta.abs.Command; +import fredboat.commandmeta.abs.CommandContext; +import fredboat.commandmeta.abs.ICommandRestricted; +import fredboat.commandmeta.abs.IInfoCommand; +import fredboat.messaging.CentralMessaging; +import fredboat.messaging.internal.Context; +import fredboat.perms.PermissionLevel; +import fredboat.perms.PermsUtil; +import fredboat.util.TextUtils; +import net.dv8tion.jda.core.EmbedBuilder; + +import javax.annotation.Nonnull; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Created by napster on 22.03.17. + *

+ * YO DAWG I HEARD YOU LIKE COMMANDS SO I PUT + * THIS COMMAND IN YO BOT SO YOU CAN SHOW MORE + * COMMANDS WHILE YOU EXECUTE THIS COMMAND + *

+ * Display available commands + */ +public class CommandsCommand extends Command implements IInfoCommand { + + public CommandsCommand(String name, String... aliases) { + super(name, aliases); + } + + private static final String ALL = "all"; + + @Override + public void onInvoke(@Nonnull CommandContext context) { + + if (!context.hasArguments()) { + + Collection enabledModules = context.getEnabledModules(); + if (!PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, context.invoker)) { + enabledModules.remove(CommandRegistry.Module.ADMIN);//dont show admin commands/modules for non admins + } + + String prefixAndCommand = "`" + context.getPrefix() + CommandInitializer.COMMANDS_COMM_NAME; + List translatedModuleNames = enabledModules.stream() + .map(module -> context.i18n(module.translationKey)) + .collect(Collectors.toList()); + context.reply(context.i18nFormat("modulesCommands", prefixAndCommand + " `", prefixAndCommand + " " + ALL + "`") + + "\n\n" + context.i18nFormat("musicCommandsPromotion", "`" + context.getPrefix() + CommandInitializer.MUSICHELP_COMM_NAME + "`") + + "\n\n" + context.i18n("modulesEnabledInGuild") + " **" + String.join("**, **", translatedModuleNames) + "**" + + "\n" + context.i18nFormat("commandsModulesHint", "`" + context.getPrefix() + CommandInitializer.MODULES_COMM_NAME + "`")); + return; + } + + List showHelpFor; + if (context.rawArgs.toLowerCase().contains(ALL.toLowerCase())) { + showHelpFor = new ArrayList<>(Arrays.asList(CommandRegistry.Module.values())); + if (!PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, context.invoker)) { + showHelpFor.remove(CommandRegistry.Module.ADMIN);//dont show admin commands/modules for non admins + } + } else { + CommandRegistry.Module module = CommandRegistry.Module.which(context.rawArgs, context); + if (module == null) { + context.reply(context.i18nFormat("moduleCantParse", + "`" + context.getPrefix() + context.command.name) + "`"); + return; + } else { + showHelpFor = Collections.singletonList(module); + } + } + + EmbedBuilder eb = CentralMessaging.getColoredEmbedBuilder(); + for (CommandRegistry.Module module : showHelpFor) { + eb = addModuleCommands(eb, context, CommandRegistry.getCommandModule(module)); + } + eb.addField("", context.i18nFormat("commandsMoreHelp", + "`" + TextUtils.escapeMarkdown(context.getPrefix()) + CommandInitializer.HELP_COMM_NAME + " `"), false); + context.reply(eb.build()); + } + + private EmbedBuilder addModuleCommands(@Nonnull EmbedBuilder embedBuilder, @Nonnull CommandContext context, + @Nonnull CommandRegistry module) { + + List commands = module.getDeduplicatedCommands() + .stream() + //do not show BOT_ADMIN or BOT_OWNER commands to users lower than that + .filter(command -> { + if (command instanceof ICommandRestricted) { + if (((ICommandRestricted) command).getMinimumPerms().getLevel() >= PermissionLevel.BOT_ADMIN.getLevel()) { + return PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, context.invoker); + } + } + return true; + }) + .collect(Collectors.toList()); + + String prefix = context.getPrefix(); + + if (commands.size() >= 6) { + //split the commands into three even columns + StringBuilder[] sbs = new StringBuilder[3]; + sbs[0] = new StringBuilder(); + sbs[1] = new StringBuilder(); + sbs[2] = new StringBuilder(); + int i = 0; + for (Command c : commands) { + if (c instanceof DestroyCommand) { + continue;//dont want to publicly show this one + } + sbs[i++ % 3].append(prefix).append(c.name).append("\n"); + } + + return embedBuilder + .addField(context.i18n(module.module.translationKey), sbs[0].toString(), true) + .addField("", sbs[1].toString(), true) + .addField("", sbs[2].toString(), true) + ; + } else { + StringBuilder sb = new StringBuilder(); + for (Command c : commands) { + sb.append(prefix).append(c.name).append("\n"); + } + return embedBuilder + .addField(context.i18n(module.module.translationKey), sb.toString(), true) + .addBlankField(true) + .addBlankField(true) + ; + } + } + + @Nonnull + @Override + public String help(@Nonnull Context context) { + return "{0}{1} OR {0}{1} " + ALL + "\n#" + context.i18n("helpCommandsCommand"); + } +} diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/DebugCommand.java b/FredBoat/src/main/java/fredboat/command/info/DebugCommand.java similarity index 97% rename from FredBoat/src/main/java/fredboat/command/maintenance/DebugCommand.java rename to FredBoat/src/main/java/fredboat/command/info/DebugCommand.java index 432cab033..b10d798eb 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/DebugCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/DebugCommand.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package fredboat.command.maintenance; +package fredboat.command.info; import fredboat.FredBoat; import fredboat.audio.player.AudioLossCounter; @@ -32,7 +32,7 @@ import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; @@ -50,7 +50,7 @@ import javax.annotation.Nonnull; import java.util.List; -public class DebugCommand extends Command implements IMaintenanceCommand, ICommandRestricted { +public class DebugCommand extends Command implements IInfoCommand, ICommandRestricted { public DebugCommand(String name, String... aliases) { super(name, aliases); diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/FuzzyUserSearchCommand.java b/FredBoat/src/main/java/fredboat/command/info/FuzzyUserSearchCommand.java similarity index 54% rename from FredBoat/src/main/java/fredboat/command/maintenance/FuzzyUserSearchCommand.java rename to FredBoat/src/main/java/fredboat/command/info/FuzzyUserSearchCommand.java index f8d068c72..1963ffcc1 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/FuzzyUserSearchCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/FuzzyUserSearchCommand.java @@ -23,12 +23,11 @@ * */ -package fredboat.command.maintenance; +package fredboat.command.info; -import fredboat.command.util.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.internal.Context; import fredboat.util.ArgumentUtil; import fredboat.util.TextUtils; @@ -36,9 +35,8 @@ import javax.annotation.Nonnull; import java.util.List; -import java.util.stream.Collectors; -public class FuzzyUserSearchCommand extends Command implements IMaintenanceCommand { +public class FuzzyUserSearchCommand extends Command implements IInfoCommand { public FuzzyUserSearchCommand(String name, String... aliases) { super(name, aliases); @@ -57,40 +55,9 @@ public void onInvoke(@Nonnull CommandContext context) { return; } - int idPadding = list.stream() - .mapToInt(member -> member.getUser().getId().length()) - .max() - .orElse(0); - int namePadding = list.stream() - .mapToInt(member -> member.getUser().getName().length()) - .max() - .orElse(0); - int nickPadding = list.stream() - .mapToInt(member -> member.getNickname() != null ? member.getNickname().length() : 0) - .max() - .orElse(0); - - List lines = list.stream() - .map(member -> TextUtils.padWithSpaces(member.getUser().getId(), idPadding, true) - + " " + TextUtils.padWithSpaces(member.getUser().getName(), namePadding, false) - + " " + TextUtils.padWithSpaces(member.getNickname(), nickPadding, false) - + "\n") - .collect(Collectors.toList()); - - - StringBuilder sb = new StringBuilder(TextUtils.padWithSpaces("Id", idPadding + 1, false) - + TextUtils.padWithSpaces("Name", namePadding + 1, false) - + TextUtils.padWithSpaces("Nick", nickPadding + 1, false) + "\n"); - - for (String line : lines) { - if (sb.length() + line.length() + query.length() < 1900) { //respect max message size - sb.append(line); - } else { - sb.append("[...]"); - break; - } - } - context.replyWithName("Results for `" + query + "`: " + TextUtils.asCodeBlock(sb.toString())); + String escapedQuery = TextUtils.escapeAndDefuse(query); + String formatted = ArgumentUtil.formatFuzzyMemberResult(list, Integer.MAX_VALUE, 1900 - escapedQuery.length()); + context.replyWithName("Results for `" + escapedQuery + "`:\n" + formatted); } } diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/GetIdCommand.java b/FredBoat/src/main/java/fredboat/command/info/GetIdCommand.java similarity index 91% rename from FredBoat/src/main/java/fredboat/command/maintenance/GetIdCommand.java rename to FredBoat/src/main/java/fredboat/command/info/GetIdCommand.java index 5dcb8333e..1f2fb1518 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/GetIdCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/GetIdCommand.java @@ -23,16 +23,16 @@ * */ -package fredboat.command.maintenance; +package fredboat.command.info; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.internal.Context; import javax.annotation.Nonnull; -public class GetIdCommand extends Command implements IMaintenanceCommand { +public class GetIdCommand extends Command implements IInfoCommand { public GetIdCommand(String name, String... aliases) { super(name, aliases); diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/GitInfoCommand.java b/FredBoat/src/main/java/fredboat/command/info/GitInfoCommand.java similarity index 89% rename from FredBoat/src/main/java/fredboat/command/maintenance/GitInfoCommand.java rename to FredBoat/src/main/java/fredboat/command/info/GitInfoCommand.java index 9f8ef3f21..68342e55a 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/GitInfoCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/GitInfoCommand.java @@ -22,14 +22,15 @@ * SOFTWARE. */ -package fredboat.command.maintenance; +package fredboat.command.info; -import fredboat.command.fun.RandomImageCommand; +import fredboat.command.fun.img.RandomImageCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; +import fredboat.shared.constant.BotConstants; import fredboat.util.GitRepoState; import fredboat.util.TextUtils; import net.dv8tion.jda.core.EmbedBuilder; @@ -45,7 +46,7 @@ *

* Display some git related information */ -public class GitInfoCommand extends Command implements IMaintenanceCommand { +public class GitInfoCommand extends Command implements IInfoCommand { private RandomImageCommand octocats = new RandomImageCommand("https://imgur.com/a/sBkTj", ""); @@ -92,7 +93,7 @@ private String getGithubCommitLink() { String result = "Could not find or create a valid Github url."; GitRepoState gitRepoState = GitRepoState.getGitRepositoryState(); if (gitRepoState != null) { - String originUrl = "git@github.com:Frederikam/FredBoat.git";// gitRepoState.remoteOriginUrl; FIXME unhardcode this. probably requires some gradle/groovy magic or a PR to the git info plugin were using + String originUrl = BotConstants.GITHUB_URL;// gitRepoState.remoteOriginUrl; FIXME unhardcode this. probably requires some gradle/groovy magic or a PR to the git info plugin were using Matcher m = GITHUB_URL_PATTERN.matcher(originUrl); @@ -111,6 +112,6 @@ private String getGithubCommitLink() { @Nonnull @Override public String help(@Nonnull Context context) { - return "{0}{1}\n#Display some git meta information about this build."; + return "{0}{1}\n#Display some git meta information about the running FredBoat build."; } } diff --git a/FredBoat/src/main/java/fredboat/command/util/HelpCommand.java b/FredBoat/src/main/java/fredboat/command/info/HelpCommand.java similarity index 93% rename from FredBoat/src/main/java/fredboat/command/util/HelpCommand.java rename to FredBoat/src/main/java/fredboat/command/info/HelpCommand.java index ddd9a107e..fe2a76097 100644 --- a/FredBoat/src/main/java/fredboat/command/util/HelpCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/HelpCommand.java @@ -1,4 +1,5 @@ /* + * * MIT License * * Copyright (c) 2017 Frederik Ar. Mikkelsen @@ -20,20 +21,20 @@ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * */ -package fredboat.command.util; +package fredboat.command.info; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import fredboat.command.moderation.PrefixCommand; +import fredboat.command.config.PrefixCommand; import fredboat.command.music.control.SelectCommand; +import fredboat.commandmeta.CommandInitializer; import fredboat.commandmeta.CommandRegistry; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.commandmeta.abs.IUtilCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; @@ -51,7 +52,7 @@ import java.text.MessageFormat; import java.util.concurrent.TimeUnit; -public class HelpCommand extends Command implements IUtilCommand { +public class HelpCommand extends Command implements IInfoCommand { //keeps track of whether a user received help lately to avoid spamming/clogging up DMs which are rather harshly ratelimited public static final Cache HELP_RECEIVED_RECENTLY = CacheBuilder.newBuilder() @@ -91,7 +92,8 @@ public static void sendGeneralHelp(@Nonnull CommandContext context) { HELP_RECEIVED_RECENTLY.put(userId, true); String out = context.i18n("helpSent"); out += "\n" + context.i18nFormat("helpCommandsPromotion", - "`" + TextUtils.escapeMarkdown(context.getPrefix()) + "commands`"); + "`" + TextUtils.escapeMarkdown(context.getPrefix()) + + CommandInitializer.COMMANDS_COMM_NAME + "`"); if (context.hasPermissions(Permission.MESSAGE_WRITE)) { context.replyWithName(out); PrefixCommand.showPrefix(context, context.getPrefix()); @@ -152,17 +154,16 @@ public static void sendFormattedCommandHelp(CommandContext context) { } private static void sendFormattedCommandHelp(CommandContext context, String trigger) { - CommandRegistry.CommandEntry commandEntry = CommandRegistry.getCommand(trigger); - if (commandEntry == null) { + Command command = CommandRegistry.findCommand(trigger); + if (command == null) { String out = "`" + TextUtils.escapeMarkdown(context.getPrefix()) + trigger + "`: " + context.i18n("helpUnknownCommand"); out += "\n" + context.i18nFormat("helpCommandsPromotion", - "`" + TextUtils.escapeMarkdown(context.getPrefix()) + "commands`"); + "`" + TextUtils.escapeMarkdown(context.getPrefix()) + + CommandInitializer.COMMANDS_COMM_NAME + "`"); context.replyWithName(out); return; } - Command command = commandEntry.command; - String out = getFormattedCommandHelp(context, command, trigger); if (command instanceof ICommandRestricted diff --git a/FredBoat/src/main/java/fredboat/command/util/InviteCommand.java b/FredBoat/src/main/java/fredboat/command/info/InviteCommand.java similarity index 92% rename from FredBoat/src/main/java/fredboat/command/util/InviteCommand.java rename to FredBoat/src/main/java/fredboat/command/info/InviteCommand.java index 2e3127e16..6e0962a0b 100644 --- a/FredBoat/src/main/java/fredboat/command/util/InviteCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/InviteCommand.java @@ -1,4 +1,5 @@ /* + * * MIT License * * Copyright (c) 2017 Frederik Ar. Mikkelsen @@ -20,21 +21,20 @@ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * */ -package fredboat.command.util; +package fredboat.command.info; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IUtilCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.internal.Context; import fredboat.util.TextUtils; import net.dv8tion.jda.core.entities.User; import javax.annotation.Nonnull; -public class InviteCommand extends Command implements IUtilCommand { +public class InviteCommand extends Command implements IInfoCommand { public InviteCommand(String name, String... aliases) { super(name, aliases); @@ -44,7 +44,7 @@ public InviteCommand(String name, String... aliases) { public void onInvoke(@Nonnull CommandContext context) { User self = context.guild.getJDA().getSelfUser(); String str = "https://discordapp.com/oauth2/authorize?&client_id=" + self.getId() + "&scope=bot"; - String send = context.i18nFormat("invite", TextUtils.escapeMarkdown(self.getName())); + String send = context.i18nFormat("invite", TextUtils.escapeAndDefuse(self.getName())); context.reply(send + "\n" + str); } diff --git a/FredBoat/src/main/java/fredboat/command/info/MusicHelpCommand.java b/FredBoat/src/main/java/fredboat/command/info/MusicHelpCommand.java new file mode 100644 index 000000000..1a4745023 --- /dev/null +++ b/FredBoat/src/main/java/fredboat/command/info/MusicHelpCommand.java @@ -0,0 +1,260 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.command.info; + +import fredboat.FredBoat; +import fredboat.command.music.control.*; +import fredboat.command.music.info.*; +import fredboat.command.music.seeking.ForwardCommand; +import fredboat.command.music.seeking.RestartCommand; +import fredboat.command.music.seeking.RewindCommand; +import fredboat.command.music.seeking.SeekCommand; +import fredboat.commandmeta.CommandInitializer; +import fredboat.commandmeta.CommandRegistry; +import fredboat.commandmeta.abs.Command; +import fredboat.commandmeta.abs.CommandContext; +import fredboat.commandmeta.abs.IInfoCommand; +import fredboat.messaging.CentralMessaging; +import fredboat.messaging.internal.Context; +import fredboat.perms.PermissionLevel; +import fredboat.perms.PermsUtil; +import fredboat.util.Emojis; +import fredboat.util.TextUtils; +import net.dv8tion.jda.core.Permission; +import net.dv8tion.jda.core.entities.TextChannel; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class MusicHelpCommand extends Command implements IInfoCommand { + + private static final String HERE = "here"; + private static final String UPDATE = "update"; + + public MusicHelpCommand(String name, String... aliases) { + super(name, aliases); + } + + @Override + public void onInvoke(@Nonnull CommandContext context) { + + if (context.args.length > 2 && context.args[0].toLowerCase().contains(UPDATE)) { + updateMessage(context); + return; + } + + boolean postInDm = true; + if (context.rawArgs.toLowerCase().contains(HERE)) { + postInDm = false; + } + + List messages = getMessages(context); + String lastOne = ""; + if (postInDm) { + lastOne = messages.remove(messages.size() - 1); + } + + for (String message : messages) { + if (postInDm) { + context.replyPrivate(message, null, CentralMessaging.NOOP_EXCEPTION_HANDLER); + } else { + context.reply(message); + } + } + + if (postInDm) { + context.replyPrivate(lastOne, + success -> context.replyWithName(context.i18n("helpSent")), + failure -> { + if (context.hasPermissions(Permission.MESSAGE_WRITE)) { + context.replyWithName(Emojis.EXCLAMATION + context.i18n("helpDmFailed")); + } + } + ); + } + } + + private static void updateMessage(CommandContext context) { + //this method is intentionally undocumented cause Napster cba to i18n it as this is intended for FBH mainly + if (!PermsUtil.checkPermsWithFeedback(PermissionLevel.ADMIN, context)) { + return; + } + long channelId; + long messageId; + try { + channelId = Long.parseUnsignedLong(context.args[1]); + messageId = Long.parseUnsignedLong(context.args[2]); + } catch (NumberFormatException e) { + context.reply("Could not parse the provided channel and/or message ids."); + return; + } + + TextChannel fbhMusicCommandsChannel = FredBoat.getTextChannelById(channelId); + if (fbhMusicCommandsChannel == null) { + context.reply("Could not find the requested channel with id " + channelId); + return; + } + List messages = getMessages(context); + if (messages.size() > 1) { + context.reply(Emojis.EXCLAMATION + "The music help is longer than one message, only the first one will be edited in."); + } + CentralMessaging.editMessage(fbhMusicCommandsChannel, messageId, + CentralMessaging.from(getMessages(context).get(0)), + null, + t -> context.reply("Could not find the message with id " + messageId + " or it is not a message that I'm allowed to edit.")); + } + + //returns the music commands ready to be posted to a channel + // may return a list with more than one message if we hit the message size limit which might happen due to long + // custom prefixes, or translations that take more letters than the stock english one + // stock english commands with stock prefix should always aim to stay in one message + // if this won't be possible in the future as more commands get added or regular commands get more complicated and + // require longer helps, its is possible to use an embed, which has a much higher character limit (6k vs 2k currently) + private static List getMessages(Context context) { + final List messages = new ArrayList<>(); + final List musicComms = getSortedMusicComms(context); + + StringBuilder out = new StringBuilder("< " + context.i18n("helpMusicCommandsHeader") + " >\n"); + for (String s : musicComms) { + if (out.length() + s.length() >= 1990) { + String block = TextUtils.asCodeBlock(out.toString(), "md"); + messages.add(block); + out = new StringBuilder(); + } + out.append(s).append("\n"); + } + String block = TextUtils.asCodeBlock(out.toString(), "md"); + messages.add(block); + return messages; + } + + private static List getSortedMusicComms(Context context) { + List musicCommands = CommandRegistry.getCommandModule(CommandRegistry.Module.MUSIC).getDeduplicatedCommands(); + + //dont explicitly show the youtube and soundcloud commands in this list, since they are just castrated versions + // of the play command, which is "good enough" for this list + musicCommands = musicCommands.stream() + .filter(command -> !(command instanceof PlayCommand + && (command.name.equals(CommandInitializer.YOUTUBE_COMM_NAME) + || command.name.equals(CommandInitializer.SOUNDCLOUD_COMM_NAME)))) + .filter(command -> !(command instanceof DestroyCommand)) + .collect(Collectors.toList()); + + musicCommands.sort(new MusicCommandsComparator()); + + List musicComms = new ArrayList<>(); + for (Command command : musicCommands) { + String formattedHelp = HelpCommand.getFormattedCommandHelp(context, command, command.name); + musicComms.add(formattedHelp); + } + + return musicComms; + } + + @Nonnull + @Override + public String help(@Nonnull Context context) { + return "{0}{1} OR {0}{1} " + HERE + "\n#" + context.i18n("helpMusicHelpCommand"); + } + + /** + * Sort the commands in a sensible way to display them to the user + */ + static class MusicCommandsComparator implements Comparator { + + @Override + public int compare(Command o1, Command o2) { + return getCommandRank(o1) - getCommandRank(o2); + } + + /** + * a container of smelly code + * http://stackoverflow.com/a/2790215 + */ + private static int getCommandRank(Command c) { + + int result; + + if (c instanceof PlayCommand) { + result = 10050; + } else if (c instanceof ListCommand) { + result = 10100; + } else if (c instanceof NowplayingCommand) { + result = 10150; + } else if (c instanceof SkipCommand) { + result = 10200; + } else if (c instanceof VoteSkipCommand) { + result = 10225; + } else if (c instanceof StopCommand) { + result = 10250; + } else if (c instanceof PauseCommand) { + result = 10300; + } else if (c instanceof UnpauseCommand) { + result = 10350; + } else if (c instanceof JoinCommand) { + result = 10400; + } else if (c instanceof LeaveCommand) { + result = 10450; + } else if (c instanceof RepeatCommand) { + result = 10500; + } else if (c instanceof ShuffleCommand) { + result = 10550; + } else if (c instanceof ReshuffleCommand) { + result = 10560; + } else if (c instanceof ForwardCommand) { + result = 10600; + } else if (c instanceof RewindCommand) { + result = 10650; + } else if (c instanceof SeekCommand) { + result = 10700; + } else if (c instanceof RestartCommand) { + result = 10750; + } else if (c instanceof HistoryCommand) { + result = 10775; + } else if (c instanceof ExportCommand) { + result = 10800; + } else if (c instanceof PlaySplitCommand) { + result = 10850; + } else if (c instanceof SelectCommand) { + result = 10900; + } else if (c instanceof GensokyoRadioCommand) { + result = 10950; + } else if (c instanceof VolumeCommand) { + result = 10970; + } else if (c instanceof DestroyCommand) { + result = 10985; + } else { + //everything else + //newly added commands will land here, just add them to the giant if construct above to assign them a fixed place + result = 10999; + } + return result; + } + } +} diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/NodesCommand.java b/FredBoat/src/main/java/fredboat/command/info/NodesCommand.java similarity index 97% rename from FredBoat/src/main/java/fredboat/command/maintenance/NodesCommand.java rename to FredBoat/src/main/java/fredboat/command/info/NodesCommand.java index 9d6811e85..b1c81cc2f 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/NodesCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/NodesCommand.java @@ -23,7 +23,7 @@ * */ -package fredboat.command.maintenance; +package fredboat.command.info; import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; import com.sedmelluq.discord.lavaplayer.remote.RemoteNode; @@ -31,7 +31,7 @@ import fredboat.audio.player.LavalinkManager; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; import fredboat.perms.PermsUtil; @@ -45,7 +45,7 @@ import java.util.ArrayList; import java.util.List; -public class NodesCommand extends Command implements IMaintenanceCommand { +public class NodesCommand extends Command implements IInfoCommand { public NodesCommand(String name, String... aliases) { super(name, aliases); @@ -180,6 +180,6 @@ private void handleLavaplayer(CommandContext context) { @Nonnull @Override public String help(@Nonnull Context context) { - return "{0}{1} OR {0}{1} host\n#Show information about the connected lava nodes."; + return "{0}{1} OR {0}{1} host\n#Show information about the connected lavalink nodes."; } } diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/PingCommand.java b/FredBoat/src/main/java/fredboat/command/info/PingCommand.java similarity index 82% rename from FredBoat/src/main/java/fredboat/command/maintenance/PingCommand.java rename to FredBoat/src/main/java/fredboat/command/info/PingCommand.java index eb95c06a1..fc3dfda53 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/PingCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/PingCommand.java @@ -1,8 +1,8 @@ -package fredboat.command.maintenance; +package fredboat.command.info; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.internal.Context; import javax.annotation.Nonnull; @@ -12,7 +12,7 @@ * Good enough of an indicator of the ping to Discord. */ -public class PingCommand extends Command implements IMaintenanceCommand { +public class PingCommand extends Command implements IInfoCommand { public PingCommand(String name, String... aliases) { super(name, aliases); diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/ShardsCommand.java b/FredBoat/src/main/java/fredboat/command/info/ShardsCommand.java similarity index 96% rename from FredBoat/src/main/java/fredboat/command/maintenance/ShardsCommand.java rename to FredBoat/src/main/java/fredboat/command/info/ShardsCommand.java index 809fee715..f728bdcf4 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/ShardsCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/ShardsCommand.java @@ -23,13 +23,13 @@ * */ -package fredboat.command.maintenance; +package fredboat.command.info; import fredboat.Config; import fredboat.FredBoat; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; import fredboat.util.TextUtils; @@ -41,7 +41,7 @@ import java.util.ArrayList; import java.util.List; -public class ShardsCommand extends Command implements IMaintenanceCommand { +public class ShardsCommand extends Command implements IInfoCommand { private static final int SHARDS_PER_MESSAGE = 30; diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/StatsCommand.java b/FredBoat/src/main/java/fredboat/command/info/StatsCommand.java similarity index 97% rename from FredBoat/src/main/java/fredboat/command/maintenance/StatsCommand.java rename to FredBoat/src/main/java/fredboat/command/info/StatsCommand.java index c457e1962..1b29bf820 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/StatsCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/StatsCommand.java @@ -23,7 +23,7 @@ * */ -package fredboat.command.maintenance; +package fredboat.command.info; import com.sedmelluq.discord.lavaplayer.tools.PlayerLibrary; import fredboat.Config; @@ -33,7 +33,7 @@ import fredboat.commandmeta.CommandManager; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.feature.I18n; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; @@ -49,7 +49,7 @@ import java.util.Map; import java.util.ResourceBundle; -public class StatsCommand extends Command implements IMaintenanceCommand { +public class StatsCommand extends Command implements IInfoCommand { public StatsCommand(String name, String... aliases) { super(name, aliases); diff --git a/FredBoat/src/main/java/fredboat/command/maintenance/VersionCommand.java b/FredBoat/src/main/java/fredboat/command/info/VersionCommand.java similarity index 91% rename from FredBoat/src/main/java/fredboat/command/maintenance/VersionCommand.java rename to FredBoat/src/main/java/fredboat/command/info/VersionCommand.java index b7095de24..39e70cd46 100644 --- a/FredBoat/src/main/java/fredboat/command/maintenance/VersionCommand.java +++ b/FredBoat/src/main/java/fredboat/command/info/VersionCommand.java @@ -23,17 +23,17 @@ * */ -package fredboat.command.maintenance; +package fredboat.command.info; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMaintenanceCommand; +import fredboat.commandmeta.abs.IInfoCommand; import fredboat.messaging.internal.Context; import net.dv8tion.jda.core.JDAInfo; import javax.annotation.Nonnull; -public class VersionCommand extends Command implements IMaintenanceCommand { +public class VersionCommand extends Command implements IInfoCommand { public VersionCommand(String name, String... aliases) { super(name, aliases); diff --git a/FredBoat/src/main/java/fredboat/command/moderation/ClearCommand.java b/FredBoat/src/main/java/fredboat/command/moderation/ClearCommand.java index f2d10dd82..3a7ba9cb8 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/ClearCommand.java +++ b/FredBoat/src/main/java/fredboat/command/moderation/ClearCommand.java @@ -25,7 +25,6 @@ package fredboat.command.moderation; -import fredboat.commandmeta.MessagingException; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IModerationCommand; @@ -42,6 +41,7 @@ import net.dv8tion.jda.core.entities.TextChannel; import javax.annotation.Nonnull; +import java.time.OffsetDateTime; import java.util.ArrayList; public class ClearCommand extends Command implements IModerationCommand { @@ -64,30 +64,37 @@ public void onInvoke(@Nonnull CommandContext context) { return; } + if (!context.guild.getSelfMember().hasPermission(channel, Permission.MESSAGE_HISTORY)) { + context.reply(context.i18n("permissionMissingBot") + " **" + Permission.MESSAGE_HISTORY.getName() + "**"); + return; + } + MessageHistory history = new MessageHistory(channel); history.retrievePast(50).queue(msgs -> { Metrics.successfulRestActions.labels("retrieveMessageHistory").inc(); - ArrayList myMessages = new ArrayList<>(); + ArrayList toDelete = new ArrayList<>(); for (Message msg : msgs) { - if (msg.getAuthor().equals(jda.getSelfUser())) { - myMessages.add(msg); + if (msg.getAuthor().equals(jda.getSelfUser()) + && youngerThanTwoWeeks(msg)) { + toDelete.add(msg); } } - if (myMessages.isEmpty()) { - throw new MessagingException("No messages found."); - } else if (myMessages.size() == 1) { + if (toDelete.isEmpty()) { + context.reply("No messages found."); + } else if (toDelete.size() == 1) { context.reply("Found one message, deleting."); - CentralMessaging.deleteMessage(myMessages.get(0)); + CentralMessaging.deleteMessage(toDelete.get(0)); } else { if (!context.hasPermissions(Permission.MESSAGE_MANAGE)) { context.reply("I must have the `Manage Messages` permission to delete my own messages in bulk."); + return; } - context.reply("Deleting **" + myMessages.size() + "** messages."); - CentralMessaging.deleteMessages(channel, myMessages); + context.reply("Deleting **" + toDelete.size() + "** messages."); + CentralMessaging.deleteMessages(channel, toDelete); } }, CentralMessaging.getJdaRestActionFailureHandler( @@ -97,6 +104,11 @@ public void onInvoke(@Nonnull CommandContext context) { ); } + private boolean youngerThanTwoWeeks(@Nonnull Message msg) { + return msg.getCreationTime().isAfter(OffsetDateTime.now().minusWeeks(2) + .plusMinutes(2));//some tolerance + } + @Nonnull @Override public String help(@Nonnull Context context) { diff --git a/FredBoat/src/main/java/fredboat/command/moderation/DisableCommandsCommand.java b/FredBoat/src/main/java/fredboat/command/moderation/DisableCommandsCommand.java deleted file mode 100644 index d5a246917..000000000 --- a/FredBoat/src/main/java/fredboat/command/moderation/DisableCommandsCommand.java +++ /dev/null @@ -1,59 +0,0 @@ -package fredboat.command.moderation; - -import fredboat.command.util.HelpCommand; -import fredboat.commandmeta.CommandManager; -import fredboat.commandmeta.CommandRegistry; -import fredboat.commandmeta.abs.Command; -import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.messaging.internal.Context; -import fredboat.perms.PermissionLevel; - -import javax.annotation.Nonnull; - -public class DisableCommandsCommand extends Command implements ICommandRestricted { - - public DisableCommandsCommand(String name, String... aliases) { - super(name, aliases); - } - - @Override - public void onInvoke(@Nonnull CommandContext context) { - - if (context.hasArguments()) { - CommandRegistry.CommandEntry commandEntry = CommandRegistry.getCommand(context.args[0]); - if (commandEntry == null) { - context.reply("This command doesn't exist!"); - return; - } - - if (commandEntry.name.equals("enable") - || commandEntry.name.equals("disable")) { - context.reply("Let's not disable this :wink:"); - return; - } - - if (CommandManager.disabledCommands.contains(commandEntry.command)) { - context.reply("This command is already disabled!"); - return; - } - - CommandManager.disabledCommands.add(commandEntry.command); - context.reply(":ok_hand: Command `" + commandEntry.name + "` disabled!"); - } else { - HelpCommand.sendFormattedCommandHelp(context); - } - } - - @Nonnull - @Override - public String help(@Nonnull Context context) { - return "{0}{1} \n#Disable a command GLOBALLY use with caution"; - } - - @Nonnull - @Override - public PermissionLevel getMinimumPerms() { - return PermissionLevel.BOT_ADMIN; - } -} diff --git a/FredBoat/src/main/java/fredboat/command/moderation/EnableCommandsCommand.java b/FredBoat/src/main/java/fredboat/command/moderation/EnableCommandsCommand.java deleted file mode 100644 index 8a43d806c..000000000 --- a/FredBoat/src/main/java/fredboat/command/moderation/EnableCommandsCommand.java +++ /dev/null @@ -1,52 +0,0 @@ -package fredboat.command.moderation; - -import fredboat.command.util.HelpCommand; -import fredboat.commandmeta.CommandManager; -import fredboat.commandmeta.CommandRegistry; -import fredboat.commandmeta.abs.Command; -import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.messaging.internal.Context; -import fredboat.perms.PermissionLevel; - -import javax.annotation.Nonnull; - -public class EnableCommandsCommand extends Command implements ICommandRestricted { - - public EnableCommandsCommand(String name, String... aliases) { - super(name, aliases); - } - - @Override - public void onInvoke(@Nonnull CommandContext context) { - - if (context.hasArguments()) { - CommandRegistry.CommandEntry commandEntry = CommandRegistry.getCommand(context.args[0]); - if (commandEntry == null) { - context.reply("This command doesn't exist!"); - return; - } - - if (CommandManager.disabledCommands.contains(commandEntry.command)) { - CommandManager.disabledCommands.remove(commandEntry.command); - context.reply(":ok_hand: Command `" + commandEntry.name + "` enabled!"); - return; - } - context.reply("This command is not disabled!"); - } else { - HelpCommand.sendFormattedCommandHelp(context); - } - } - - @Nonnull - @Override - public String help(@Nonnull Context context) { - return "{0}{1} \n#Re-enable a globally disabled command"; - } - - @Nonnull - @Override - public PermissionLevel getMinimumPerms() { - return PermissionLevel.BOT_ADMIN; - } -} diff --git a/FredBoat/src/main/java/fredboat/command/moderation/HardbanCommand.java b/FredBoat/src/main/java/fredboat/command/moderation/HardbanCommand.java index f44a2a3c4..0cfdef16c 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/HardbanCommand.java +++ b/FredBoat/src/main/java/fredboat/command/moderation/HardbanCommand.java @@ -24,7 +24,7 @@ package fredboat.command.moderation; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IModerationCommand; @@ -84,7 +84,7 @@ public void onInvoke(@Nonnull CommandContext context) { //on success String successOutput = context.i18nFormat("hardbanSuccess", - TextUtils.escapeMarkdown(target.getUser().getName()), target.getUser().getDiscriminator(), target.getUser().getId()) + TextUtils.escapeAndDefuse(target.getUser().getName()), target.getUser().getDiscriminator(), target.getUser().getId()) + "\n" + plainReason; Consumer onSuccess = aVoid -> { Metrics.successfulRestActions.labels("ban").inc(); @@ -126,7 +126,7 @@ private boolean checkHardBanAuthorization(CommandContext context, Member target) } if (DiscordUtil.getHighestRolePosition(mod) <= DiscordUtil.getHighestRolePosition(target) && !mod.isOwner()) { - context.replyWithName(context.i18nFormat("modFailUserHierarchy", TextUtils.escapeMarkdown(target.getEffectiveName()))); + context.replyWithName(context.i18nFormat("modFailUserHierarchy", TextUtils.escapeAndDefuse(target.getEffectiveName()))); return false; } @@ -136,7 +136,7 @@ private boolean checkHardBanAuthorization(CommandContext context, Member target) } if (DiscordUtil.getHighestRolePosition(mod.getGuild().getSelfMember()) <= DiscordUtil.getHighestRolePosition(target)) { - context.replyWithName(context.i18nFormat("modFailBotHierarchy", TextUtils.escapeMarkdown(target.getEffectiveName()))); + context.replyWithName(context.i18nFormat("modFailBotHierarchy", TextUtils.escapeAndDefuse(target.getEffectiveName()))); return false; } diff --git a/FredBoat/src/main/java/fredboat/command/moderation/KickCommand.java b/FredBoat/src/main/java/fredboat/command/moderation/KickCommand.java index e3d9b6e64..0ecb9c146 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/KickCommand.java +++ b/FredBoat/src/main/java/fredboat/command/moderation/KickCommand.java @@ -24,7 +24,7 @@ package fredboat.command.moderation; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IModerationCommand; @@ -84,7 +84,7 @@ public void onInvoke(@Nonnull CommandContext context) { //on success String successOutput = context.i18nFormat("kickSuccess", - TextUtils.escapeMarkdown(target.getUser().getName()), target.getUser().getDiscriminator(), target.getUser().getId()) + TextUtils.escapeAndDefuse(target.getUser().getName()), target.getUser().getDiscriminator(), target.getUser().getId()) + "\n" + plainReason; Consumer onSuccess = aVoid -> { Metrics.successfulRestActions.labels("kick").inc(); @@ -126,7 +126,7 @@ private boolean checkKickAuthorization(CommandContext context, Member target) { } if (DiscordUtil.getHighestRolePosition(mod) <= DiscordUtil.getHighestRolePosition(target) && !mod.isOwner()) { - context.replyWithName(context.i18nFormat("modFailUserHierarchy", TextUtils.escapeMarkdown(target.getEffectiveName()))); + context.replyWithName(context.i18nFormat("modFailUserHierarchy", TextUtils.escapeAndDefuse(target.getEffectiveName()))); return false; } @@ -136,7 +136,7 @@ private boolean checkKickAuthorization(CommandContext context, Member target) { } if (DiscordUtil.getHighestRolePosition(mod.getGuild().getSelfMember()) <= DiscordUtil.getHighestRolePosition(target)) { - context.replyWithName(context.i18nFormat("modFailBotHierarchy", TextUtils.escapeMarkdown(target.getEffectiveName()))); + context.replyWithName(context.i18nFormat("modFailBotHierarchy", TextUtils.escapeAndDefuse(target.getEffectiveName()))); return false; } diff --git a/FredBoat/src/main/java/fredboat/command/moderation/SoftbanCommand.java b/FredBoat/src/main/java/fredboat/command/moderation/SoftbanCommand.java index d2970d587..53a2fad6c 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/SoftbanCommand.java +++ b/FredBoat/src/main/java/fredboat/command/moderation/SoftbanCommand.java @@ -25,7 +25,7 @@ package fredboat.command.moderation; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IModerationCommand; @@ -78,7 +78,7 @@ public void onInvoke(@Nonnull CommandContext context) { //on success String successOutput = context.i18nFormat("softbanSuccess", - TextUtils.escapeMarkdown(target.getUser().getName()), target.getUser().getDiscriminator(), target.getUser().getId()) + TextUtils.escapeAndDefuse(target.getUser().getName()), target.getUser().getDiscriminator(), target.getUser().getId()) + "\n" + plainReason; Consumer onSuccess = aVoid -> { Metrics.successfulRestActions.labels("ban").inc(); @@ -125,7 +125,7 @@ private boolean checkAuthorization(CommandContext context, Member target) { } if (DiscordUtil.getHighestRolePosition(mod) <= DiscordUtil.getHighestRolePosition(target) && !mod.isOwner()) { - context.replyWithName(context.i18nFormat("modFailUserHierarchy", TextUtils.escapeMarkdown(target.getEffectiveName()))); + context.replyWithName(context.i18nFormat("modFailUserHierarchy", TextUtils.escapeAndDefuse(target.getEffectiveName()))); return false; } @@ -135,7 +135,7 @@ private boolean checkAuthorization(CommandContext context, Member target) { } if (DiscordUtil.getHighestRolePosition(mod.getGuild().getSelfMember()) <= DiscordUtil.getHighestRolePosition(target)) { - context.replyWithName(context.i18nFormat("modFailBotHierarchy", TextUtils.escapeMarkdown(target.getEffectiveName()))); + context.replyWithName(context.i18nFormat("modFailBotHierarchy", TextUtils.escapeAndDefuse(target.getEffectiveName()))); return false; } diff --git a/FredBoat/src/main/java/fredboat/command/music/control/PlayCommand.java b/FredBoat/src/main/java/fredboat/command/music/control/PlayCommand.java index 1df091466..ef7434b15 100644 --- a/FredBoat/src/main/java/fredboat/command/music/control/PlayCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/control/PlayCommand.java @@ -27,11 +27,7 @@ import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; -import fredboat.audio.player.GuildPlayer; -import fredboat.audio.player.LavalinkManager; -import fredboat.audio.player.PlayerLimitManager; -import fredboat.audio.player.PlayerRegistry; -import fredboat.audio.player.VideoSelection; +import fredboat.audio.player.*; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; @@ -56,6 +52,7 @@ public class PlayCommand extends Command implements IMusicCommand, ICommandRestr private static final org.slf4j.Logger log = LoggerFactory.getLogger(PlayCommand.class); private final List searchProviders; private static final JoinCommand JOIN_COMMAND = new JoinCommand(""); + private static final String FILE_PREFIX = "file://"; public PlayCommand(List searchProviders, String name, String... aliases) { super(name, aliases); @@ -95,10 +92,13 @@ public void onInvoke(@Nonnull CommandContext context) { String url = StringUtils.strip(context.args[0], "<>"); //Search youtube for videos and let the user select a video - if (!url.startsWith("http")) { + if (!url.startsWith("http") && !url.startsWith(FILE_PREFIX)) { searchForVideos(context); return; } + if (url.startsWith(FILE_PREFIX)) { + url = url.replaceFirst(FILE_PREFIX, ""); //LocalAudioSourceManager does not manage this itself + } GuildPlayer player = PlayerRegistry.getOrCreate(context.guild); @@ -166,7 +166,7 @@ private void searchForVideos(CommandContext context) { builder.append("\n**") .append(String.valueOf(i)) .append(":** ") - .append(track.getInfo().title) + .append(TextUtils.escapeAndDefuse(track.getInfo().title)) .append(" (") .append(TextUtils.formatTime(track.getInfo().length)) .append(")"); diff --git a/FredBoat/src/main/java/fredboat/command/music/control/PlaySplitCommand.java b/FredBoat/src/main/java/fredboat/command/music/control/PlaySplitCommand.java index ce33a9873..9d66bc691 100644 --- a/FredBoat/src/main/java/fredboat/command/music/control/PlaySplitCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/control/PlaySplitCommand.java @@ -29,7 +29,7 @@ import fredboat.audio.player.PlayerLimitManager; import fredboat.audio.player.PlayerRegistry; import fredboat.audio.queue.IdentifierContext; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; diff --git a/FredBoat/src/main/java/fredboat/command/music/control/RepeatCommand.java b/FredBoat/src/main/java/fredboat/command/music/control/RepeatCommand.java index 31cab3659..c4fdd9a0f 100644 --- a/FredBoat/src/main/java/fredboat/command/music/control/RepeatCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/control/RepeatCommand.java @@ -28,7 +28,7 @@ import fredboat.audio.player.GuildPlayer; import fredboat.audio.player.PlayerRegistry; import fredboat.audio.queue.RepeatMode; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; diff --git a/FredBoat/src/main/java/fredboat/command/music/control/SelectCommand.java b/FredBoat/src/main/java/fredboat/command/music/control/SelectCommand.java index c9859637c..4dc065559 100644 --- a/FredBoat/src/main/java/fredboat/command/music/control/SelectCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/control/SelectCommand.java @@ -107,7 +107,8 @@ static void select(CommandContext context) { for (int i = 0; i < validChoices.size(); i++) { selectedTracks[i] = selection.choices.get(validChoices.get(i) - 1); - String msg = context.i18nFormat("selectSuccess", validChoices.get(i), selectedTracks[i].getInfo().title, + String msg = context.i18nFormat("selectSuccess", validChoices.get(i), + TextUtils.escapeAndDefuse(selectedTracks[i].getInfo().title), TextUtils.formatTime(selectedTracks[0].getInfo().length)); if (i < validChoices.size()) { outputMsgBuilder.append("\n"); diff --git a/FredBoat/src/main/java/fredboat/command/music/control/SkipCommand.java b/FredBoat/src/main/java/fredboat/command/music/control/SkipCommand.java index b8d7eeb60..522e49ae7 100644 --- a/FredBoat/src/main/java/fredboat/command/music/control/SkipCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/control/SkipCommand.java @@ -28,7 +28,7 @@ import fredboat.audio.player.GuildPlayer; import fredboat.audio.player.PlayerRegistry; import fredboat.audio.queue.AudioTrackContext; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; @@ -128,7 +128,8 @@ private void skipGivenIndex(GuildPlayer player, CommandContext context) { AudioTrackContext atc = player.getTracksInRange(givenIndex - 1, givenIndex).get(0); - String successMessage = context.i18nFormat("skipSuccess", givenIndex, atc.getEffectiveTitle()); + String successMessage = context.i18nFormat("skipSuccess", givenIndex, + TextUtils.escapeAndDefuse(atc.getEffectiveTitle())); player.skipTracksForMemberPerms(context, Collections.singletonList(atc.getTrackId()), successMessage); } @@ -205,14 +206,14 @@ private void skipUser(GuildPlayer player, CommandContext context, List use if (userAtcIds.size() > 0) { - String title = player.getPlayingTrack().getEffectiveTitle(); + String title = TextUtils.escapeAndDefuse(player.getPlayingTrack().getEffectiveTitle()); player.skipTracks(userAtcIds); if (affectedUsers.size() > 1) { context.reply(context.i18nFormat("skipUsersMultiple", ("`" + userAtcIds.size() + "`"), ("**" + affectedUsers.size() + "**"))); } else { User user = affectedUsers.get(0); - String userName = "**" + TextUtils.escapeMarkdown(user.getName()) + "#" + user.getDiscriminator() + "**"; + String userName = "**" + TextUtils.escapeAndDefuse(user.getName()) + "#" + user.getDiscriminator() + "**"; if (userAtcIds.size() == 1) { context.reply(context.i18nFormat("skipUserSingle", "**" + title + "**", userName)); } else { @@ -230,7 +231,8 @@ private void skipNext(CommandContext context) { if (atc == null) { context.reply(context.i18n("skipTrackNotFound")); } else { - String successMessage = context.i18nFormat("skipSuccess", 1, atc.getEffectiveTitle()); + String successMessage = context.i18nFormat("skipSuccess", 1, + TextUtils.escapeAndDefuse(atc.getEffectiveTitle())); player.skipTracksForMemberPerms(context, Collections.singletonList(atc.getTrackId()), successMessage); } } diff --git a/FredBoat/src/main/java/fredboat/command/music/control/VolumeCommand.java b/FredBoat/src/main/java/fredboat/command/music/control/VolumeCommand.java index 1b6f36a4f..62d886320 100644 --- a/FredBoat/src/main/java/fredboat/command/music/control/VolumeCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/control/VolumeCommand.java @@ -36,6 +36,7 @@ import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; +import fredboat.shared.constant.BotConstants; import javax.annotation.Nonnull; import java.util.concurrent.TimeUnit; @@ -65,7 +66,8 @@ public void onInvoke(@Nonnull CommandContext context) { 100 * PlayerRegistry.DEFAULT_VOLUME, Math.floor(player.getVolume() * 100))); } } else { - context.reply(context.i18n("volumeApology"), msg -> CentralMessaging.restService.schedule( + String out = context.i18n("volumeApology") + "\n<" + BotConstants.DOCS_DONATE_URL + ">"; + context.replyImage("https://fred.moe/1vD.png", out, msg -> CentralMessaging.restService.schedule( () -> CentralMessaging.deleteMessage(msg), 2, TimeUnit.MINUTES)); } diff --git a/FredBoat/src/main/java/fredboat/command/music/control/VoteSkipCommand.java b/FredBoat/src/main/java/fredboat/command/music/control/VoteSkipCommand.java index c377abb8e..05ec62430 100644 --- a/FredBoat/src/main/java/fredboat/command/music/control/VoteSkipCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/control/VoteSkipCommand.java @@ -3,7 +3,7 @@ import fredboat.audio.player.GuildPlayer; import fredboat.audio.player.PlayerRegistry; import fredboat.audio.queue.AudioTrackContext; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; @@ -18,11 +18,7 @@ import net.dv8tion.jda.core.entities.User; import javax.annotation.Nonnull; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; public class VoteSkipCommand extends Command implements IMusicCommand, ICommandRestricted { @@ -71,7 +67,7 @@ public void onInvoke(@Nonnull CommandContext context) { context.reply(context.i18n("skipTrackNotFound")); } else { String skipPerc = "`" + TextUtils.formatPercent(skipPercentage) + "`"; - String trackTitle = "**" + atc.getEffectiveTitle() + "**"; + String trackTitle = "**" + TextUtils.escapeAndDefuse(atc.getEffectiveTitle()) + "**"; context.reply(response + "\n" + context.i18nFormat("voteSkipSkipping", skipPerc, trackTitle)); player.skip(); } @@ -157,7 +153,7 @@ private void displayVoteList(CommandContext context, GuildPlayer player) { Member member = context.getGuild().getMemberById(userId); if (member != null) { - field.append("| ").append(TextUtils.escapeMarkdown(member.getEffectiveName())).append("\n"); + field.append("| ").append(TextUtils.escapeAndDefuse(member.getEffectiveName())).append("\n"); } } EmbedBuilder embed = CentralMessaging.getColoredEmbedBuilder(); @@ -170,7 +166,7 @@ private void displayVoteList(CommandContext context, GuildPlayer player) { @Nonnull @Override public String help(@Nonnull Context context) { - return context.i18n("helpVoteSkip"); + return "{0}{1} OR {0}{1} list\n#" + context.i18n("helpVoteSkip"); } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/music/info/HistoryCommand.java b/FredBoat/src/main/java/fredboat/command/music/info/HistoryCommand.java index d70a6472c..67bf7255a 100644 --- a/FredBoat/src/main/java/fredboat/command/music/info/HistoryCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/info/HistoryCommand.java @@ -97,8 +97,8 @@ public void onInvoke(@Nonnull CommandContext context) { TextUtils.forceNDigits(i + 1, numberLength) + "]", MessageBuilder.Formatting.BLOCK) .append(status) - .append(context.i18nFormat("listAddedBy", TextUtils.escapeMarkdown(atc.getEffectiveTitle()), - TextUtils.escapeMarkdown(username), TextUtils.formatTime(atc.getEffectiveDuration()))) + .append(context.i18nFormat("listAddedBy", TextUtils.escapeAndDefuse(atc.getEffectiveTitle()), + TextUtils.escapeAndDefuse(username), TextUtils.formatTime(atc.getEffectiveDuration()))) .append("\n"); if (i == listEnd) { @@ -114,7 +114,7 @@ public void onInvoke(@Nonnull CommandContext context) { @Nonnull @Override public String help(@Nonnull Context context) { - String usage = "{0}{1}\n#"; + String usage = "{0}{1} (page)\n#"; return usage + context.i18n("helpHistoryCommand"); } } \ No newline at end of file diff --git a/FredBoat/src/main/java/fredboat/command/music/info/ListCommand.java b/FredBoat/src/main/java/fredboat/command/music/info/ListCommand.java index 60c9f774a..e3ee4335b 100644 --- a/FredBoat/src/main/java/fredboat/command/music/info/ListCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/info/ListCommand.java @@ -115,8 +115,8 @@ public void onInvoke(@Nonnull CommandContext context) { TextUtils.forceNDigits(i + 1, numberLength) + "]", MessageBuilder.Formatting.BLOCK) .append(status) - .append(context.i18nFormat("listAddedBy", TextUtils.escapeMarkdown(atc.getEffectiveTitle()), - TextUtils.escapeMarkdown(username), TextUtils.formatTime(atc.getEffectiveDuration()))) + .append(context.i18nFormat("listAddedBy", TextUtils.escapeAndDefuse(atc.getEffectiveTitle()), + TextUtils.escapeAndDefuse(username), TextUtils.formatTime(atc.getEffectiveDuration()))) .append("\n"); if (i == listEnd) { @@ -157,6 +157,6 @@ public void onInvoke(@Nonnull CommandContext context) { @Nonnull @Override public String help(@Nonnull Context context) { - return "{0}{1}\n#" + context.i18n("helpListCommand"); + return "{0}{1} (page)\n#" + context.i18n("helpListCommand"); } } diff --git a/FredBoat/src/main/java/fredboat/command/music/seeking/ForwardCommand.java b/FredBoat/src/main/java/fredboat/command/music/seeking/ForwardCommand.java index 96e77eea1..e91a12ba6 100644 --- a/FredBoat/src/main/java/fredboat/command/music/seeking/ForwardCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/seeking/ForwardCommand.java @@ -29,7 +29,7 @@ import fredboat.audio.player.GuildPlayer; import fredboat.audio.player.PlayerRegistry; import fredboat.audio.queue.AudioTrackContext; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; @@ -76,7 +76,8 @@ public void onInvoke(@Nonnull CommandContext context) { t = Math.min(atc.getEffectiveDuration(), t); player.seekTo(player.getPosition() + t); - context.reply(context.i18nFormat("fwdSuccess", atc.getEffectiveTitle(), TextUtils.formatTime(t))); + context.reply(context.i18nFormat("fwdSuccess", + TextUtils.escapeAndDefuse(atc.getEffectiveTitle()), TextUtils.formatTime(t))); } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/music/seeking/RestartCommand.java b/FredBoat/src/main/java/fredboat/command/music/seeking/RestartCommand.java index 15437a369..b8cdb658d 100644 --- a/FredBoat/src/main/java/fredboat/command/music/seeking/RestartCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/seeking/RestartCommand.java @@ -33,6 +33,7 @@ import fredboat.commandmeta.abs.IMusicCommand; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; +import fredboat.util.TextUtils; import javax.annotation.Nonnull; @@ -51,7 +52,8 @@ public void onInvoke(@Nonnull CommandContext context) { player.play(); } player.seekTo(player.getPlayingTrack().getStartPosition()); - context.reply(context.i18nFormat("restartSuccess", player.getPlayingTrack().getEffectiveTitle())); + context.reply(context.i18nFormat("restartSuccess", + TextUtils.escapeAndDefuse(player.getPlayingTrack().getEffectiveTitle()))); } else { context.replyWithName(context.i18n("queueEmpty")); } diff --git a/FredBoat/src/main/java/fredboat/command/music/seeking/RewindCommand.java b/FredBoat/src/main/java/fredboat/command/music/seeking/RewindCommand.java index b4010e858..31fbaa518 100644 --- a/FredBoat/src/main/java/fredboat/command/music/seeking/RewindCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/seeking/RewindCommand.java @@ -27,7 +27,7 @@ import fredboat.audio.player.GuildPlayer; import fredboat.audio.player.PlayerRegistry; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; @@ -72,7 +72,8 @@ public void onInvoke(@Nonnull CommandContext context) { t = Math.min(currentPosition, t); player.seekTo(currentPosition - t); - context.reply(context.i18nFormat("rewSuccess", player.getPlayingTrack().getEffectiveTitle(), TextUtils.formatTime(t))); + context.reply(context.i18nFormat("rewSuccess", + TextUtils.escapeAndDefuse(player.getPlayingTrack().getEffectiveTitle()), TextUtils.formatTime(t))); } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/music/seeking/SeekCommand.java b/FredBoat/src/main/java/fredboat/command/music/seeking/SeekCommand.java index a217cda6b..e90620235 100644 --- a/FredBoat/src/main/java/fredboat/command/music/seeking/SeekCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/seeking/SeekCommand.java @@ -28,7 +28,7 @@ import fredboat.audio.player.GuildPlayer; import fredboat.audio.player.PlayerRegistry; import fredboat.audio.queue.AudioTrackContext; -import fredboat.command.util.HelpCommand; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; @@ -74,7 +74,8 @@ public void onInvoke(@Nonnull CommandContext context) { t = Math.min(atc.getEffectiveDuration(), t); player.seekTo(atc.getStartPosition() + t); - context.reply(context.i18nFormat("seekSuccess", atc.getEffectiveTitle(), TextUtils.formatTime(t))); + context.reply(context.i18nFormat("seekSuccess", + TextUtils.escapeAndDefuse(atc.getEffectiveTitle()), TextUtils.formatTime(t))); } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/util/AvatarCommand.java b/FredBoat/src/main/java/fredboat/command/util/AvatarCommand.java index 35d1b9e27..ff6172427 100644 --- a/FredBoat/src/main/java/fredboat/command/util/AvatarCommand.java +++ b/FredBoat/src/main/java/fredboat/command/util/AvatarCommand.java @@ -25,6 +25,7 @@ package fredboat.command.util; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IUtilCommand; diff --git a/FredBoat/src/main/java/fredboat/command/util/BrainfuckCommand.java b/FredBoat/src/main/java/fredboat/command/util/BrainfuckCommand.java index 2d34b4eb2..40e73ca6c 100644 --- a/FredBoat/src/main/java/fredboat/command/util/BrainfuckCommand.java +++ b/FredBoat/src/main/java/fredboat/command/util/BrainfuckCommand.java @@ -25,17 +25,25 @@ package fredboat.command.util; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IUtilCommand; import fredboat.messaging.internal.Context; import fredboat.util.BrainfuckException; +import fredboat.util.TextUtils; +import org.json.JSONException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.annotation.Nonnull; +import java.io.IOException; import java.nio.ByteBuffer; public class BrainfuckCommand extends Command implements IUtilCommand { + private static final Logger log = LoggerFactory.getLogger(BrainfuckCommand.class); + public BrainfuckCommand(String name, String... aliases) { super(name, aliases); } @@ -44,7 +52,7 @@ public BrainfuckCommand(String name, String... aliases) { char[] code; public static final int MAX_CYCLE_COUNT = 10000; - public String process(String input, Context context) { + public String process(@Nonnull String input, @Nonnull Context context) { int data = 0; char[] inChars = input.toCharArray(); int inChar = 0; @@ -62,7 +70,7 @@ public String process(String input, Context context) { break; case '<': --data; - if(data < 0){ + if (data < 0) { throw new BrainfuckException(context.i18nFormat("brainfuckDataPointerOutOfBounds", data)); } break; @@ -86,7 +94,10 @@ public String process(String input, Context context) { if (bytes.get(data) == 0) { int depth = 1; do { - command = code[++instruction]; + if (++instruction >= code.length) { + throw new BrainfuckException("Instruction out of bounds at position " + (inChar + 1)); + } + command = code[instruction]; if (command == '[') { ++depth; } else if (command == ']') { @@ -99,7 +110,10 @@ public String process(String input, Context context) { if (bytes.get(data) != 0) { int depth = -1; do { - command = code[--instruction]; + if (--instruction < 0) { + throw new BrainfuckException("Instruction out of bounds at position " + (inChar + 1)); + } + command = code[instruction]; if (command == '[') { ++depth; } else if (command == ']') { @@ -133,17 +147,31 @@ public void onInvoke(@Nonnull CommandContext context) { inputArg = inputArg.replaceAll("ZERO", String.valueOf((char) 0)); String out = process(inputArg, context); - //TextUtils.replyWithMention(channel, invoker, " " + out); - String out2 = ""; + StringBuilder sb = new StringBuilder(); for (char c : out.toCharArray()) { int sh = (short) c; - out2 = out2 + "," + sh; + sb.append(",").append(sh); } - try { - context.replyWithName(" " + out + "\n-------\n" + out2.substring(1)); - } catch (IndexOutOfBoundsException ex) { + String out2 = sb.toString(); + if (out2.isEmpty()) { context.replyWithName(context.i18n("brainfuckNoOutput")); + return; } + + String output = " " + out + "\n-------\n" + out2.substring(1); + if (output.length() >= 2000) { + String message = "The output of your brainfuck code is too long to be displayed on Discord";//todo i18n + try { + String pasteUrl = TextUtils.postToPasteService(output); + context.reply(message + " and has been uploaded to " + pasteUrl); //todo i18n + } catch (IOException | JSONException e) { + log.error("Failed to upload to any pasteservice.", e); + context.reply(message); + } + return; + } + + context.reply(output); } @Nonnull diff --git a/FredBoat/src/main/java/fredboat/command/util/CommandsCommand.java b/FredBoat/src/main/java/fredboat/command/util/CommandsCommand.java deleted file mode 100644 index a8acfc735..000000000 --- a/FredBoat/src/main/java/fredboat/command/util/CommandsCommand.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Frederik Ar. Mikkelsen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package fredboat.command.util; - -import fredboat.Config; -import fredboat.command.fun.RemoteFileCommand; -import fredboat.command.fun.TextCommand; -import fredboat.commandmeta.CommandRegistry; -import fredboat.commandmeta.abs.Command; -import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.commandmeta.abs.IFunCommand; -import fredboat.commandmeta.abs.IMaintenanceCommand; -import fredboat.commandmeta.abs.IModerationCommand; -import fredboat.commandmeta.abs.IUtilCommand; -import fredboat.messaging.internal.Context; -import fredboat.perms.PermissionLevel; -import fredboat.perms.PermsUtil; -import fredboat.util.TextUtils; -import net.dv8tion.jda.core.Permission; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Created by napster on 22.03.17. - *

- * YO DAWG I HEARD YOU LIKE COMMANDS SO I PUT - * THIS COMMAND IN YO BOT SO YOU CAN SHOW MORE - * COMMANDS WHILE YOU EXECUTE THIS COMMAND - *

- * Display available commands - */ -public class CommandsCommand extends Command implements IUtilCommand { - - public CommandsCommand(String name, String... aliases) { - super(name, aliases); - } - - //design inspiration by Weiss Schnee's bot - //https://cdn.discordapp.com/attachments/230033957998166016/296356070685671425/unknown.png - @Override - public void onInvoke(@Nonnull CommandContext context) { - - //is this the music boat? shortcut to showing those commands - //taking this shortcut we're missing out on showing a few commands to pure music bot users - // http://i.imgur.com/511Hb8p.png screenshot from 1st April 2017 - //bot owner and debug commands (+ ;;music and ;;help) missing + the currently defunct config command - //this is currently fine but might change in the future - MusicHelpCommand.invoke(context); - if (Config.CONFIG.isDevDistribution()) { - mainBotHelp(context); //TODO: decide how to do handle this after unification of main and music bot - } - } - - private void mainBotHelp(CommandContext context) { - Set commandsAndAliases = CommandRegistry.getRegisteredCommandsAndAliases(); - Set unsortedAliases = new HashSet<>(); //hash set = only unique commands - for (String commandOrAlias : commandsAndAliases) { - String mainAlias = CommandRegistry.getCommand(commandOrAlias).name; - unsortedAliases.add(mainAlias); - } - //alphabetical order - List sortedAliases = new ArrayList<>(unsortedAliases); - Collections.sort(sortedAliases); - - String fun = "**" + context.i18n("commandsFun") + ":** "; - String memes = "**" + context.i18n("commandsMemes") + ":**"; - String util = "**" + context.i18n("commandsUtility") + ":** "; - String mod = "**" + context.i18n("commandsModeration") + ":** "; - String maint = "**" + context.i18n("commandsMaintenance") + ":** "; - String owner = "**" + context.i18n("commandsBotOwner") + ":** "; - - for (String alias : sortedAliases) { - Command c = CommandRegistry.getCommand(alias).command; - String formattedAlias = "`" + alias + "` "; - - if (c instanceof ICommandRestricted - && ((ICommandRestricted) c).getMinimumPerms() == PermissionLevel.BOT_OWNER) { - owner += formattedAlias; - } else if (c instanceof TextCommand || c instanceof RemoteFileCommand) { - memes += formattedAlias; - } else { - //overlap is possible in here, that's ok - if (c instanceof IFunCommand) { - fun += formattedAlias; - } - if (c instanceof IUtilCommand) { - util += formattedAlias; - } - if (c instanceof IModerationCommand) { - mod += formattedAlias; - } - if (c instanceof IMaintenanceCommand) { - maint += formattedAlias; - } - } - } - - String out = fun; - out += "\n" + util; - out += "\n" + memes; - - if (context.invoker.hasPermission(Permission.MESSAGE_MANAGE)) { - out += "\n" + mod; - } - - if (PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, context.invoker)) { - out += "\n" + maint; - } - - if (PermsUtil.checkPerms(PermissionLevel.BOT_OWNER, context.invoker)) { - out += "\n" + owner; - } - - out += "\n\n" + context.i18nFormat("commandsMoreHelp", - "`" + TextUtils.escapeMarkdown(context.getPrefix()) + "help `"); - context.reply(out); - } - - @Nonnull - @Override - public String help(@Nonnull Context context) { - return "{0}{1}\n#" + context.i18n("helpCommandsCommand"); - } -} diff --git a/FredBoat/src/main/java/fredboat/command/util/MALCommand.java b/FredBoat/src/main/java/fredboat/command/util/MALCommand.java index 1cb29b91f..328507488 100644 --- a/FredBoat/src/main/java/fredboat/command/util/MALCommand.java +++ b/FredBoat/src/main/java/fredboat/command/util/MALCommand.java @@ -27,6 +27,7 @@ import fredboat.Config; import fredboat.FredBoat; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IUtilCommand; @@ -118,11 +119,11 @@ private void requestAsync(String term, CommandContext context) { log.warn("MAL request blew up", e); } - context.reply(context.i18nFormat("malNoResults", TextUtils.escapeMarkdown(context.invoker.getEffectiveName()))); + context.reply(context.i18nFormat("malNoResults", TextUtils.escapeAndDefuse(context.invoker.getEffectiveName()))); } private boolean handleAnime(CommandContext context, String terms, String body) { - String msg = context.i18nFormat("malRevealAnime", TextUtils.escapeMarkdown(context.invoker.getEffectiveName())); + String msg = context.i18nFormat("malRevealAnime", TextUtils.escapeAndDefuse(context.invoker.getEffectiveName())); //Read JSON log.info(body); @@ -185,13 +186,13 @@ private boolean handleAnime(CommandContext context, String terms, String body) { } private boolean handleUser(CommandContext context, String body) { - String msg = context.i18nFormat("malUserReveal", TextUtils.escapeMarkdown(context.invoker.getEffectiveName())); + String msg = context.i18nFormat("malUserReveal", TextUtils.escapeAndDefuse(context.invoker.getEffectiveName())); //Read JSON JSONObject root = new JSONObject(body); JSONArray items = root.getJSONArray("categories").getJSONObject(0).getJSONArray("items"); if (items.length() == 0) { - context.reply(context.i18nFormat("malNoResults", TextUtils.escapeMarkdown(context.invoker.getEffectiveName()))); + context.reply(context.i18nFormat("malNoResults", TextUtils.escapeAndDefuse(context.invoker.getEffectiveName()))); return false; } diff --git a/FredBoat/src/main/java/fredboat/command/util/MathCommand.java b/FredBoat/src/main/java/fredboat/command/util/MathCommand.java index f0a8faae7..d3dff4de1 100644 --- a/FredBoat/src/main/java/fredboat/command/util/MathCommand.java +++ b/FredBoat/src/main/java/fredboat/command/util/MathCommand.java @@ -25,6 +25,7 @@ package fredboat.command.util; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IUtilCommand; diff --git a/FredBoat/src/main/java/fredboat/command/util/MusicHelpCommand.java b/FredBoat/src/main/java/fredboat/command/util/MusicHelpCommand.java deleted file mode 100644 index 79e1dc239..000000000 --- a/FredBoat/src/main/java/fredboat/command/util/MusicHelpCommand.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Frederik Ar. Mikkelsen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -package fredboat.command.util; - -import fredboat.command.music.control.*; -import fredboat.command.music.info.ExportCommand; -import fredboat.command.music.info.GensokyoRadioCommand; -import fredboat.command.music.info.ListCommand; -import fredboat.command.music.info.NowplayingCommand; -import fredboat.command.music.seeking.ForwardCommand; -import fredboat.command.music.seeking.RestartCommand; -import fredboat.command.music.seeking.RewindCommand; -import fredboat.command.music.seeking.SeekCommand; -import fredboat.commandmeta.CommandRegistry; -import fredboat.commandmeta.abs.Command; -import fredboat.commandmeta.abs.CommandContext; -import fredboat.commandmeta.abs.IMusicCommand; -import fredboat.commandmeta.abs.IUtilCommand; -import fredboat.messaging.internal.Context; -import fredboat.util.Emojis; -import fredboat.util.TextUtils; -import net.dv8tion.jda.core.Permission; - -import java.util.*; -import javax.annotation.Nonnull; - -public class MusicHelpCommand extends Command implements IUtilCommand { - - public MusicHelpCommand(String name, String... aliases) { - super(name, aliases); - } - - @Override - public void onInvoke(@Nonnull CommandContext context) { - invoke(context); - } - - - public static void invoke(@Nonnull CommandContext context) { - getFormattedCommandHelp(context); - } - - //TODO this does a lot of i18n calls, music comms are static tho (except for the language), so they should be cached per language - private static List getMusicComms(Context context) { - //aggregate all commands and the aliases they may be called with - Map, List> commandToAliases = new HashMap<>(); - Set commandsAndAliases = CommandRegistry.getRegisteredCommandsAndAliases(); - for (String commandOrAlias : commandsAndAliases) { - Command command = CommandRegistry.getCommand(commandOrAlias).command; - - List aliases = commandToAliases.get(command.getClass()); - if (aliases == null) aliases = new ArrayList<>(); - aliases.add(commandOrAlias); - commandToAliases.put(command.getClass(), aliases); - } - - //sum up existing music commands & sort them in a presentable way - List sortedComms = new ArrayList<>(); - for (List as : commandToAliases.values()) { - Command c = CommandRegistry.getCommand(as.get(0)).command; - if (c instanceof IMusicCommand) - sortedComms.add(c); - } - sortedComms.sort(new MusicCommandsComparator()); - - //create help strings for each music command and its main alias - List musicComms = new ArrayList<>(); - for (Command command : sortedComms) { - - String mainAlias = commandToAliases.get(command.getClass()).get(0); - mainAlias = CommandRegistry.getCommand(mainAlias).name; - String formattedHelp = HelpCommand.getFormattedCommandHelp(context, command, mainAlias); - musicComms.add(formattedHelp); - } - - return musicComms; - } - - private static void getFormattedCommandHelp(CommandContext context) { - final List musicComms = getMusicComms(context); - - // Start building string: - String out = "< " + context.i18n("helpMusicCommandsHeader") + " >\n"; - for (String s : musicComms) { - if (out.length() + s.length() >= 1990) { - sendCommandsHelpInDM(context, out); - out = ""; - } - out += s + "\n"; - } - sendCommandsHelpInDM(context, out); - } - - private static void sendCommandsHelpInDM(CommandContext context, String dmMsg) { - context.replyPrivate(TextUtils.asCodeBlock(dmMsg, "md"), - success -> context.replyWithName(context.i18n("helpSent")), - failure -> { - if (context.hasPermissions(Permission.MESSAGE_WRITE)) { - context.replyWithName(Emojis.EXCLAMATION + context.i18n("helpDmFailed")); - } - } - ); - } - - @Nonnull - @Override - public String help(@Nonnull Context context) { - return "{0}{1}\n#" + context.i18n("helpMusicHelpCommand"); - } - - /** - * Sort the commands in a sensible way to display them to the user - */ - static class MusicCommandsComparator implements Comparator { - - @Override - public int compare(Command o1, Command o2) { - return getCommandRank(o1) - getCommandRank(o2); - } - - /** - * a container of smelly code - * http://stackoverflow.com/a/2790215 - */ - private static int getCommandRank(Command c) { - - int result; - - if (c instanceof PlayCommand) { - result = 10050; - } else if (c instanceof ListCommand) { - result = 10100; - } else if (c instanceof NowplayingCommand) { - result = 10150; - } else if (c instanceof SkipCommand) { - result = 10200; - } else if (c instanceof StopCommand) { - result = 10250; - } else if (c instanceof PauseCommand) { - result = 10300; - } else if (c instanceof UnpauseCommand) { - result = 10350; - } else if (c instanceof JoinCommand) { - result = 10400; - } else if (c instanceof LeaveCommand) { - result = 10450; - } else if (c instanceof RepeatCommand) { - result = 10500; - } else if (c instanceof ShuffleCommand) { - result = 10550; - } else if (c instanceof ReshuffleCommand) { - result = 10560; - } else if (c instanceof ForwardCommand) { - result = 10600; - } else if (c instanceof RewindCommand) { - result = 10650; - } else if (c instanceof SeekCommand) { - result = 10700; - } else if (c instanceof RestartCommand) { - result = 10750; - } else if (c instanceof ExportCommand) { - result = 10800; - } else if (c instanceof PlaySplitCommand) { - result = 10850; - } else if (c instanceof SelectCommand) { - result = 10900; - } else if (c instanceof GensokyoRadioCommand) { - result = 10950; - } else if (c instanceof VolumeCommand) { - result = 10970; - } else { - //everything else - //newly added commands will land here, just add them to the giant if construct above to assign them a fixed place - result = 10999; - } - return result; - } - } -} diff --git a/FredBoat/src/main/java/fredboat/command/util/RoleInfoCommand.java b/FredBoat/src/main/java/fredboat/command/util/RoleInfoCommand.java new file mode 100644 index 000000000..9086468a7 --- /dev/null +++ b/FredBoat/src/main/java/fredboat/command/util/RoleInfoCommand.java @@ -0,0 +1,105 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.command.util; + +import fredboat.command.info.HelpCommand; +import fredboat.commandmeta.abs.Command; +import fredboat.commandmeta.abs.CommandContext; +import fredboat.messaging.CentralMessaging; +import fredboat.messaging.internal.Context; +import fredboat.util.ArgumentUtil; +import net.dv8tion.jda.core.EmbedBuilder; +import net.dv8tion.jda.core.Permission; +import net.dv8tion.jda.core.entities.IMentionable; +import net.dv8tion.jda.core.entities.Role; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.awt.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Created by napster on 18.01.18. + */ +public class RoleInfoCommand extends Command { + + public RoleInfoCommand(@Nonnull String name, String... aliases) { + super(name, aliases); + } + + @Nonnull + @Override + public String help(@Nonnull Context context) { + return "{0}{1} \n#" + "Display information about a role."; //todo i18n + } + + @Override + public void onInvoke(@Nonnull CommandContext context) { + + if (!context.hasArguments()) { + HelpCommand.sendFormattedCommandHelp(context); + return; + } + + List roles = new ArrayList<>(ArgumentUtil.fuzzyRoleSearch(context.guild, context.rawArgs)); + + Role role = (Role) ArgumentUtil.checkSingleFuzzySearchResult(roles, context, context.rawArgs); + if (role == null) return; + + EmbedBuilder eb = CentralMessaging.getClearThreadLocalEmbedBuilder(); + eb.setTitle("Information about role " + role.getName() + ":") //todo i18n + .setColor(role.getColor()) + .addField("Name", role.getName(), true) //todo i18n + .addField("Id", role.getId(), true) //todo i18n + .addField("Color", colorToHex(role.getColor()), true) //todo i18n + .addField("Hoisted", Boolean.toString(role.isHoisted()), true) //todo i18n + .addField("Mentionable", Boolean.toString(role.isMentionable()), true) //todo i18n + .addField("Managed", Boolean.toString(role.isManaged()), true) //todo i18n + .addField("Permissions", permissionsToString(role.getPermissions()), true) //todo i18n + ; + context.reply(eb.build()); + } + + private static String permissionsToString(@Nullable Collection perms) { + if (perms == null || perms.isEmpty()) { + return "none"; //todo i18n + } + return String.join(", ", perms.stream().map(Permission::getName).collect(Collectors.toList())); + } + + private static String colorToHex(@Nullable Color color) { + if (color == null) { + return "none"; //todo i18n + } + return "#" + + Integer.toString(color.getRed(), 16).toUpperCase() + + Integer.toString(color.getGreen(), 16).toUpperCase() + + Integer.toString(color.getBlue(), 16).toUpperCase(); + } +} diff --git a/FredBoat/src/main/java/fredboat/command/util/ServerInfoCommand.java b/FredBoat/src/main/java/fredboat/command/util/ServerInfoCommand.java index 97b2a0185..439738f0d 100644 --- a/FredBoat/src/main/java/fredboat/command/util/ServerInfoCommand.java +++ b/FredBoat/src/main/java/fredboat/command/util/ServerInfoCommand.java @@ -34,7 +34,6 @@ import net.dv8tion.jda.core.EmbedBuilder; import net.dv8tion.jda.core.OnlineStatus; import net.dv8tion.jda.core.entities.Guild; -import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.MessageEmbed; import javax.annotation.Nonnull; @@ -52,18 +51,16 @@ public ServerInfoCommand(String name, String... aliases) { @Override public void onInvoke(@Nonnull CommandContext context) { Guild guild = context.guild; - int i = 0; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MMM-yyyy"); EmbedBuilder eb = CentralMessaging.getColoredEmbedBuilder(); eb.setTitle(context.i18nFormat("serverinfoTitle", guild.getName()), null); eb.setThumbnail(guild.getIconUrl()); - for (Member u : guild.getMembers()) { - if(u.getOnlineStatus() != OnlineStatus.OFFLINE) { - i++; - } - } - eb.addField(context.i18n("serverinfoOnlineUsers"), String.valueOf(i), true); + long onlineMembers = guild.getMemberCache().stream() + .filter(m -> m.getOnlineStatus() != OnlineStatus.OFFLINE) + .count(); + + eb.addField(context.i18n("serverinfoOnlineUsers"), String.valueOf(onlineMembers), true); eb.addField(context.i18n("serverinfoTotalUsers"), String.valueOf(guild.getMembers().size()), true); eb.addField(context.i18n("serverinfoRoles"), String.valueOf(guild.getRoles().size()), true); eb.addField(context.i18n("serverinfoText"), String.valueOf(guild.getTextChannels().size()), true); diff --git a/FredBoat/src/main/java/fredboat/command/util/UserInfoCommand.java b/FredBoat/src/main/java/fredboat/command/util/UserInfoCommand.java index 9805a225e..7e42ef488 100644 --- a/FredBoat/src/main/java/fredboat/command/util/UserInfoCommand.java +++ b/FredBoat/src/main/java/fredboat/command/util/UserInfoCommand.java @@ -93,7 +93,7 @@ public void onInvoke(@Nonnull CommandContext context) { .addField(context.i18n("userinfoJoinDate"), target.getJoinDate().format(dtf), true) .addField(context.i18n("userinfoCreationTime"), target.getUser().getCreationTime().format(dtf), true) .addField(context.i18n("userinfoBlacklisted"), - Boolean.toString(Ratelimiter.getRatelimiter().isBlacklisted(context.invoker.getUser().getIdLong())), true) + Boolean.toString(Ratelimiter.getRatelimiter().isBlacklisted(target.getUser().getIdLong())), true) .build() ); } diff --git a/FredBoat/src/main/java/fredboat/command/util/WeatherCommand.java b/FredBoat/src/main/java/fredboat/command/util/WeatherCommand.java index d5da4eddf..bf92adcd8 100644 --- a/FredBoat/src/main/java/fredboat/command/util/WeatherCommand.java +++ b/FredBoat/src/main/java/fredboat/command/util/WeatherCommand.java @@ -1,5 +1,6 @@ package fredboat.command.util; +import fredboat.command.info.HelpCommand; import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.IUtilCommand; diff --git a/FredBoat/src/main/java/fredboat/commandmeta/CommandInitializer.java b/FredBoat/src/main/java/fredboat/commandmeta/CommandInitializer.java new file mode 100644 index 000000000..6031a836e --- /dev/null +++ b/FredBoat/src/main/java/fredboat/commandmeta/CommandInitializer.java @@ -0,0 +1,257 @@ +/* + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.commandmeta; + +import fredboat.command.admin.*; +import fredboat.command.config.*; +import fredboat.command.fun.*; +import fredboat.command.fun.img.*; +import fredboat.command.info.*; +import fredboat.command.moderation.ClearCommand; +import fredboat.command.moderation.HardbanCommand; +import fredboat.command.moderation.KickCommand; +import fredboat.command.moderation.SoftbanCommand; +import fredboat.command.music.control.*; +import fredboat.command.music.info.*; +import fredboat.command.music.seeking.ForwardCommand; +import fredboat.command.music.seeking.RestartCommand; +import fredboat.command.music.seeking.RewindCommand; +import fredboat.command.music.seeking.SeekCommand; +import fredboat.command.util.*; +import fredboat.perms.PermissionLevel; +import fredboat.shared.constant.BotConstants; +import fredboat.util.AsciiArtConstant; +import fredboat.util.rest.OpenWeatherAPI; +import fredboat.util.rest.SearchUtil; + +import java.util.Arrays; +import java.util.Collections; + +public class CommandInitializer { + + //the main alias of some commands are reused across the bot. these constants make sure any changes to them dont break things + public static final String MODULES_COMM_NAME = "modules"; + public static final String HELP_COMM_NAME = "help"; + public static final String SKIP_COMM_NAME = "skip"; + public static final String COMMANDS_COMM_NAME = "commands"; + public static final String MUSICHELP_COMM_NAME = "music"; + public static final String YOUTUBE_COMM_NAME = "youtube"; + public static final String SOUNDCLOUD_COMM_NAME = "soundcloud"; + public static final String PREFIX_COMM_NAME = "prefix"; + + public static void initCommands() { + + // Administrative Module - always on (as in, essential commands for BOT_ADMINs and BOT_OWNER) + CommandRegistry adminModule = new CommandRegistry(CommandRegistry.Module.ADMIN); + adminModule.registerCommand(new AnnounceCommand("announce")); + adminModule.registerCommand(new BotRestartCommand("botrestart")); + adminModule.registerCommand(new DisableCommandsCommand("disable")); + adminModule.registerCommand(new DiscordPermissionCommand("discordpermissions", "disperms")); + adminModule.registerCommand(new EnableCommandsCommand("enable")); + adminModule.registerCommand(new EvalCommand("eval")); + adminModule.registerCommand(new ExitCommand("exit")); + adminModule.registerCommand(new GetNodeCommand("getnode")); + adminModule.registerCommand(new LeaveServerCommand("leaveserver")); + adminModule.registerCommand(new NodeAdminCommand("node")); + adminModule.registerCommand(new PlayerDebugCommand("playerdebug")); + adminModule.registerCommand(new ReviveCommand("revive")); + adminModule.registerCommand(new SentryDsnCommand("sentrydsn")); + adminModule.registerCommand(new SetAvatarCommand("setavatar")); + adminModule.registerCommand(new TestCommand("test")); + adminModule.registerCommand(new UnblacklistCommand("unblacklist", "unlimit")); + + + // Informational / Debugging / Maintenance - always on + CommandRegistry infoModule = new CommandRegistry(CommandRegistry.Module.INFO); + infoModule.registerCommand(new AudioDebugCommand("adebug")); + infoModule.registerCommand(new CommandsCommand(COMMANDS_COMM_NAME, "comms", "cmds")); + infoModule.registerCommand(new DebugCommand("debug")); + infoModule.registerCommand(new FuzzyUserSearchCommand("fuzzy")); + infoModule.registerCommand(new GetIdCommand("getid")); + infoModule.registerCommand(new GitInfoCommand("gitinfo", "git")); + infoModule.registerCommand(new HelpCommand(HELP_COMM_NAME, "info")); + infoModule.registerCommand(new InviteCommand("invite")); + infoModule.registerCommand(new MusicHelpCommand(MUSICHELP_COMM_NAME, "musichelp")); + infoModule.registerCommand(new NodesCommand("nodes")); + infoModule.registerCommand(new PingCommand("ping")); + infoModule.registerCommand(new ShardsCommand("shards")); + infoModule.registerCommand(new StatsCommand("stats", "uptime")); + infoModule.registerCommand(new VersionCommand("version")); + infoModule.registerCommand(new TextCommand("https://github.com/Frederikam", "github")); + infoModule.registerCommand(new TextCommand(BotConstants.GITHUB_URL, "repo")); + + + // Configurational stuff - always on + CommandRegistry configModule = new CommandRegistry(CommandRegistry.Module.CONFIG); + configModule.registerCommand(new ConfigCommand("config", "cfg")); + configModule.registerCommand(new LanguageCommand("language", "lang")); + configModule.registerCommand(new ModulesCommand("modules", "module", "mods")); + configModule.registerCommand(new PrefixCommand(PREFIX_COMM_NAME, "pre")); + /* Perms */ + configModule.registerCommand(new PermissionsCommand(PermissionLevel.ADMIN, "admin", "admins")); + configModule.registerCommand(new PermissionsCommand(PermissionLevel.DJ, "dj", "djs")); + configModule.registerCommand(new PermissionsCommand(PermissionLevel.USER, "user", "users")); + + + // Moderation Module - Anything related to managing Discord guilds + CommandRegistry moderationModule = new CommandRegistry(CommandRegistry.Module.MOD); + moderationModule.registerCommand(new ClearCommand("clear")); + moderationModule.registerCommand(new HardbanCommand("hardban", "hb")); + moderationModule.registerCommand(new KickCommand("kick")); + moderationModule.registerCommand(new SoftbanCommand("softban", "sb")); + + + // Utility Module - Like Fun commands but without the fun ¯\_(ツ)_/¯ + CommandRegistry utilityModule = new CommandRegistry(CommandRegistry.Module.UTIL); + utilityModule.registerCommand(new AvatarCommand("avatar", "ava")); + utilityModule.registerCommand(new BrainfuckCommand("brainfuck")); + utilityModule.registerCommand(new MALCommand("mal")); + utilityModule.registerCommand(new MathCommand("math")); + utilityModule.registerCommand(new RoleInfoCommand("roleinfo")); + utilityModule.registerCommand(new ServerInfoCommand("serverinfo", "guildinfo")); + utilityModule.registerCommand(new UserInfoCommand("userinfo", "memberinfo")); + utilityModule.registerCommand(new WeatherCommand(new OpenWeatherAPI(), "weather")); + + + // Fun Module - mostly ascii, memes, pictures, games + CommandRegistry funModule = new CommandRegistry(CommandRegistry.Module.FUN); + funModule.registerCommand(new AkinatorCommand("akinator", "aki")); + funModule.registerCommand(new DanceCommand("dance")); + funModule.registerCommand(new JokeCommand("joke", "jk")); + funModule.registerCommand(new RiotCommand("riot")); + funModule.registerCommand(new SayCommand("say")); + + /* Other Anime Discord, Sergi memes or any other memes + saved in this album https://imgur.com/a/wYvDu */ + + /* antique FredBoat staff insiders */ + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/j8VvjOT.png", "rude")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/oJL7m7m.png", "fuck")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/BrCCbfx.png", "idc")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/jjoz783.png", "beingraped")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/w7x1885.png", "wow")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/GNsAxkh.png", "what")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/sBfq3wM.png", "pun")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/pQiT26t.jpg", "cancer")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/YT1Bkhj.png", "stupidbot")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/QmI469j.png", "escape")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/mKdTGlg.png", "noods")); + funModule.registerCommand(new RestrictedRemoteFileCommand(PermissionLevel.BOT_ADMIN, "http://i.imgur.com/i65ss6p.png", "powerpoint")); + + funModule.registerCommand(new RemoteFileCommand("http://i.imgur.com/DYToB2e.jpg", "ram")); + funModule.registerCommand(new RemoteFileCommand("http://i.imgur.com/utPRe0e.gif", "welcome")); + funModule.registerCommand(new RemoteFileCommand("http://i.imgur.com/93VahIh.png", "anime")); + funModule.registerCommand(new RemoteFileCommand("http://i.imgur.com/qz6g1vj.gif", "explosion")); + funModule.registerCommand(new RemoteFileCommand("http://i.imgur.com/84nbpQe.png", "internetspeed")); + + /* Text Faces & Unicode 'Art' & ASCII 'Art' and Stuff */ + funModule.registerCommand(new TextCommand("¯\\_(ツ)_/¯", "shrug", "shr")); + funModule.registerCommand(new TextCommand("ಠ_ಠ", "faceofdisapproval", "fod", "disapproving")); + funModule.registerCommand(new TextCommand("༼ つ ◕_◕ ༽つ", "sendenergy")); + funModule.registerCommand(new TextCommand("(•\\_•) ( •\\_•)>⌐■-■ (⌐■_■)", "dealwithit", "dwi")); + funModule.registerCommand(new TextCommand("(ノ◕ヮ◕)ノ*:・゚✧ ✧゚・: *ヽ(◕ヮ◕ヽ)", "channelingenergy")); + funModule.registerCommand(new TextCommand("Ƹ̵̡Ӝ̵̨̄Ʒ", "butterfly")); + funModule.registerCommand(new TextCommand("(ノಠ益ಠ)ノ彡┻━┻", "angrytableflip", "tableflipbutangry", "atp")); + funModule.registerCommand(new TextCommand(AsciiArtConstant.DOG, "dog", "cooldog", "dogmeme")); + funModule.registerCommand(new TextCommand("T-that's l-lewd, baka!!!", "lewd", "lood", "l00d")); + funModule.registerCommand(new TextCommand("This command is useless.", "useless")); + funModule.registerCommand(new TextCommand("¯\\\\(°_o)/¯", "shrugwtf", "swtf")); + funModule.registerCommand(new TextCommand("ヽ(^o^)ノ", "hurray", "yay", "woot")); + /* Lennies */ + funModule.registerCommand(new TextCommand("/╲/╭( ͡° ͡° ͜ʖ ͡° ͡°)╮/╱\\", "spiderlenny")); + funModule.registerCommand(new TextCommand("( ͡° ͜ʖ ͡°)", "lenny")); + funModule.registerCommand(new TextCommand("┬┴┬┴┤ ͜ʖ ͡°) ├┬┴┬┴", "peeking", "peekinglenny", "peek")); + funModule.registerCommand(new TextCommand(AsciiArtConstant.EAGLE_OF_LENNY, "eagleoflenny", "eol", "lennyeagle")); + funModule.registerCommand(new MagicCommand("magic", "magicallenny", "lennymagical")); + funModule.registerCommand(new TextCommand("( ͡°( ͡° ͜ʖ( ͡° ͜ʖ ͡°)ʖ ͡°) ͡°)", "lennygang")); + + /* Random images / image collections */ + funModule.registerCommand(new CatgirlCommand("catgirl", "neko", "catgrill")); + funModule.registerCommand(new FacedeskCommand("https://imgur.com/a/I5Q4U", "facedesk")); + funModule.registerCommand(new HugCommand("https://imgur.com/a/jHJOc", "hug")); + funModule.registerCommand(new PatCommand("https://imgur.com/a/WiPTl", "pat")); + funModule.registerCommand(new RollCommand("https://imgur.com/a/lrEwS", "roll")); + funModule.registerCommand(new RandomImageCommand("https://imgur.com/a/mnhzS", "wombat")); + + + // Music Module + + CommandRegistry musicModule = new CommandRegistry(CommandRegistry.Module.MUSIC); + /* Control */ + musicModule.registerCommand(new DestroyCommand("destroy")); + musicModule.registerCommand(new JoinCommand("join", "summon", "jn", "j")); + musicModule.registerCommand(new LeaveCommand("leave", "lv")); + musicModule.registerCommand(new PauseCommand("pause", "pa", "ps")); + musicModule.registerCommand(new PlayCommand(Arrays.asList(SearchUtil.SearchProvider.YOUTUBE, SearchUtil.SearchProvider.SOUNDCLOUD), + "play", "p")); + musicModule.registerCommand(new PlayCommand(Collections.singletonList(SearchUtil.SearchProvider.YOUTUBE), + YOUTUBE_COMM_NAME, "yt")); + musicModule.registerCommand(new PlayCommand(Collections.singletonList(SearchUtil.SearchProvider.SOUNDCLOUD), + SOUNDCLOUD_COMM_NAME, "sc")); + musicModule.registerCommand(new PlaySplitCommand("split")); + musicModule.registerCommand(new RepeatCommand("repeat", "rep")); + musicModule.registerCommand(new ReshuffleCommand("reshuffle", "resh")); + musicModule.registerCommand(new SelectCommand("select", buildNumericalSelectAliases("sel"))); + musicModule.registerCommand(new ShuffleCommand("shuffle", "sh", "random")); + musicModule.registerCommand(new SkipCommand(SKIP_COMM_NAME, "sk", "s")); + musicModule.registerCommand(new StopCommand("stop", "st")); + musicModule.registerCommand(new UnpauseCommand("unpause", "unp", "resume")); + musicModule.registerCommand(new VolumeCommand("volume", "vol")); + musicModule.registerCommand(new VoteSkipCommand("voteskip", "vsk", "v")); + + /* Info */ + musicModule.registerCommand(new ExportCommand("export", "ex")); + musicModule.registerCommand(new GensokyoRadioCommand("gensokyo", "gr", "gensokyoradio")); + musicModule.registerCommand(new HistoryCommand("history", "hist", "h")); + musicModule.registerCommand(new ListCommand("list", "queue", "q", "l")); + musicModule.registerCommand(new NowplayingCommand("nowplaying", "np")); + + /* Seeking */ + musicModule.registerCommand(new ForwardCommand("forward", "fwd")); + musicModule.registerCommand(new RestartCommand("restart", "replay")); + musicModule.registerCommand(new RewindCommand("rewind", "rew")); + musicModule.registerCommand(new SeekCommand("seek")); + } + + + /** + * Build a string array that consist of the max number of searches. + * + * @param extraAliases Aliases to be appended to the rest of the ones being built. + * @return String array that contains string representation of numbers with addOnAliases. + */ + private static String[] buildNumericalSelectAliases(String... extraAliases) { + String[] selectTrackAliases = new String[SearchUtil.MAX_RESULTS + extraAliases.length]; + int i = 0; + for (; i < extraAliases.length; i++) { + selectTrackAliases[i] = extraAliases[i]; + } + for (; i < SearchUtil.MAX_RESULTS + extraAliases.length; i++) { + selectTrackAliases[i] = String.valueOf(i - extraAliases.length + 1); + } + return selectTrackAliases; + } + +} diff --git a/FredBoat/src/main/java/fredboat/commandmeta/CommandRegistry.java b/FredBoat/src/main/java/fredboat/commandmeta/CommandRegistry.java index a1ae03d8d..37499587a 100644 --- a/FredBoat/src/main/java/fredboat/commandmeta/CommandRegistry.java +++ b/FredBoat/src/main/java/fredboat/commandmeta/CommandRegistry.java @@ -26,73 +26,142 @@ package fredboat.commandmeta; import fredboat.commandmeta.abs.Command; -import fredboat.commandmeta.abs.CommandContext; import fredboat.messaging.internal.Context; +import fredboat.util.Emojis; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.HashMap; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; public class CommandRegistry { - private static HashMap registry = new HashMap<>(); + private static Map modules = new HashMap<>(); - public static void registerCommand(@Nonnull Command command) { - String name = command.name.toLowerCase(); - CommandEntry entry = new CommandEntry(command, name); - registry.put(name, entry); - for (String alias : command.aliases) { - registry.put(alias.toLowerCase(), entry); + public static void registerModule(@Nonnull CommandRegistry registry) { + modules.put(registry.module, registry); + } + + @Nonnull + public static CommandRegistry getCommandModule(@Nonnull Module module) { + CommandRegistry mod = modules.get(module); + if (mod == null) { + throw new IllegalStateException("No such module registered: " + module.name()); } + return mod; } @Nullable - public static CommandEntry getCommand(@Nonnull String name) { - return registry.get(name); + public static Command findCommand(@Nonnull String name) { + return modules.values().stream() + .map(cr -> cr.getCommand(name)) + .filter(Objects::nonNull) + .findAny() + .orElse(null); } - public static int getSize() { - return registry.size(); + public static int getTotalSize() { + return modules.values().stream() + .mapToInt(CommandRegistry::getSize) + .sum(); } - public static Set getRegisteredCommandsAndAliases() { - return registry.keySet(); + public static Set getAllRegisteredCommandsAndAliases() { + return modules.values().stream() + .flatMap(cr -> cr.getRegisteredCommandsAndAliases().stream()) + .collect(Collectors.toSet()); } - public static void removeCommand(String name) { - CommandEntry entry = new CommandEntry(new Command(name) { - @Override - public void onInvoke(@Nonnull CommandContext context) { - context.reply("This command is temporarily disabled"); - } - @Nonnull - @Override - public String help(@Nonnull Context context) { - return "Temporarily disabled command"; - } - }, name); + private Map registry = new LinkedHashMap<>();//linked hash map to keep track of the order + public final Module module; - registry.put(name, entry); + public CommandRegistry(@Nonnull Module module) { + this.module = module; + registerModule(this); } - public static class CommandEntry { + public void registerCommand(@Nonnull Command command) { + String name = command.name.toLowerCase(); + registry.put(name, command); + for (String alias : command.aliases) { + registry.put(alias.toLowerCase(), command); + } + command.setModule(this.module); + } - public Command command; - public String name; + //may contain duplicates, if a command was added additional aliases + //ordered by the order they were registered + public List getCommands() { + return new ArrayList<>(registry.values()); + } - CommandEntry(Command command, String name) { - this.command = command; - this.name = name; + //list of unique commands. unique as in, different names, not necessarily different command classes + // see Command#equals for more info + public List getDeduplicatedCommands() { + List result = new ArrayList<>(); + for (Command c : registry.values()) { + if (!result.contains(c)) { + result.add(c); + } } + return result; + } - public String getName() { - return name; + @Nonnull + public Set getRegisteredCommandsAndAliases() { + return registry.keySet(); + } + + public int getSize() { + return registry.size(); + } + + @Nullable + public Command getCommand(@Nonnull String name) { + return registry.get(name); + } + + //a locked module cannot be enabled/disabled + public enum Module { + + //@formatter:off locked + // enabledByDef + ADMIN ("moduleAdmin", Emojis.KEY, true, true), + INFO ("moduleInfo", Emojis.INFO, true, true), + CONFIG("moduleConfig", Emojis.GEAR, true, true), + MUSIC ("moduleMusic", Emojis.MUSIC, true, true), + MOD ("moduleModeration", Emojis.HAMMER, true, false), + UTIL ("moduleUtility", Emojis.TOOLS, true, false), + FUN ("moduleFun", Emojis.DIE, true, false), + ; + //@formatter:on + + @Nonnull + public final String translationKey; + @Nonnull + public final String emoji; + public final boolean enabledByDefault; + public final boolean lockedModule; + + Module(@Nonnull String translationKey, @Nonnull String emoji, boolean enabledByDefault, boolean lockedModule) { + this.translationKey = translationKey; + this.emoji = emoji; + this.enabledByDefault = enabledByDefault; + this.lockedModule = lockedModule; } - public void setCommand(Command command) { - this.command = command; + @Nullable + //attempts to identify the module from the given input. checks for the name of the enum + translated versions + public static Module which(@Nonnull String input, @Nonnull Context context) { + String lowerInput = input.toLowerCase(); + for (Module module : Module.values()) { + if (lowerInput.contains(module.name().toLowerCase()) + || lowerInput.contains(context.i18n(module.translationKey).toLowerCase())) { + return module; + } + } + return null; } } } diff --git a/FredBoat/src/main/java/fredboat/commandmeta/abs/Command.java b/FredBoat/src/main/java/fredboat/commandmeta/abs/Command.java index 88693f74d..8b2bf7edb 100644 --- a/FredBoat/src/main/java/fredboat/commandmeta/abs/Command.java +++ b/FredBoat/src/main/java/fredboat/commandmeta/abs/Command.java @@ -25,7 +25,10 @@ package fredboat.commandmeta.abs; +import fredboat.commandmeta.CommandRegistry; + import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Arrays; import java.util.List; @@ -34,8 +37,25 @@ public abstract class Command implements ICommand { public final String name; public final List aliases; + @Nullable + private CommandRegistry.Module module; + protected Command(@Nonnull String name, String... aliases) { this.name = name; this.aliases = Arrays.asList(aliases); } + + public void setModule(@Nullable CommandRegistry.Module module) { + this.module = module; + } + + @Nullable + public CommandRegistry.Module getModule() { + return module; + } + + @Override + public boolean equals(Object obj) { + return (obj instanceof Command) && ((Command) obj).name.equals(this.name); + } } diff --git a/FredBoat/src/main/java/fredboat/commandmeta/abs/CommandContext.java b/FredBoat/src/main/java/fredboat/commandmeta/abs/CommandContext.java index 2159a0fb9..32fda7d43 100644 --- a/FredBoat/src/main/java/fredboat/commandmeta/abs/CommandContext.java +++ b/FredBoat/src/main/java/fredboat/commandmeta/abs/CommandContext.java @@ -26,8 +26,11 @@ package fredboat.commandmeta.abs; import fredboat.Config; -import fredboat.command.moderation.PrefixCommand; +import fredboat.FredBoat; +import fredboat.command.config.PrefixCommand; +import fredboat.commandmeta.CommandInitializer; import fredboat.commandmeta.CommandRegistry; +import fredboat.db.entity.main.GuildModules; import fredboat.feature.metrics.Metrics; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; @@ -40,6 +43,7 @@ import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -99,8 +103,9 @@ public static CommandContext parse(MessageReceivedEvent event) { Metrics.prefixParsed.labels("custom").inc(); } } else { - //hardcoded check for the help command that is always displayed as FredBoat status - if (raw.startsWith(Config.CONFIG.getPrefix() + "help")) { + //hardcoded check for the help or prefix command that is always displayed as FredBoat status + if (raw.startsWith(Config.CONFIG.getPrefix() + CommandInitializer.HELP_COMM_NAME) + || raw.startsWith(Config.CONFIG.getPrefix() + CommandInitializer.PREFIX_COMM_NAME)) { Metrics.prefixParsed.labels("default").inc(); input = raw.substring(Config.CONFIG.getPrefix().length()); } else { @@ -126,8 +131,8 @@ public static CommandContext parse(MessageReceivedEvent event) { String commandTrigger = args[0]; - CommandRegistry.CommandEntry entry = CommandRegistry.getCommand(commandTrigger.toLowerCase()); - if (entry == null) { + Command command = CommandRegistry.findCommand(commandTrigger.toLowerCase()); + if (command == null) { log.info("Unknown command:\t{}", commandTrigger); return null; } else { @@ -139,7 +144,7 @@ public static CommandContext parse(MessageReceivedEvent event) { context.isMention = isMention; context.trigger = commandTrigger; - context.command = entry.command; + context.command = command; context.args = Arrays.copyOfRange(args, 1, args.length);//exclude args[0] that contains the command trigger context.rawArgs = input.replaceFirst(commandTrigger, "").trim(); return context; @@ -158,13 +163,72 @@ private CommandContext(@Nonnull Guild guild, @Nonnull TextChannel channel, @Nonn */ public void deleteMessage() { TextChannel tc = msg.getTextChannel(); - if (tc != null && hasPermissions(tc, Permission.MESSAGE_MANAGE, //While Manage Message _should_ be enough as it _should_ - Permission.MESSAGE_READ, // implicitly give us all the other Text permissions, - Permission.MESSAGE_HISTORY)) { // it is bugged, so we do some additional checks here. - CentralMessaging.deleteMessage(msg); // See https://github.com/DV8FromTheWorld/JDA/issues/414 for more info. + + if (tc != null && hasPermissions(tc, Permission.MESSAGE_MANAGE) + && hasExplicitPermissionOrIsAdmin(tc, Permission.MESSAGE_MANAGE)) { + CentralMessaging.deleteMessage(msg); } } + //workaround check for https://github.com/DV8FromTheWorld/JDA/issues/414 + // we check all permission overrides and roles for channel, its optional parent, and serverwide roles for an explicit + // grant of the provided permission and return true if there is at least one such grant + @SuppressWarnings("Duplicates") + private static boolean hasExplicitPermissionOrIsAdmin(@Nonnull TextChannel channel, @Nonnull Permission permission) { + Member self = channel.getGuild().getSelfMember(); + if (self == null) { + return false; + } + if (self.hasPermission(Permission.ADMINISTRATOR)) { + return true; + } + + List roles = new ArrayList<>(self.getRoles()); + roles.add(self.getGuild().getPublicRole()); + Category parent = channel.getParent(); + + + PermissionOverride memberChannelPO = channel.getPermissionOverride(self); + if (memberChannelPO != null) { + if (memberChannelPO.getAllowed().contains(permission)) { + return true; + } + } + + if (parent != null) { + PermissionOverride memberCategoryPO = parent.getPermissionOverride(self); + if (memberCategoryPO != null) { + if (memberCategoryPO.getAllowed().contains(permission)) { + return true; + } + } + } + + for (Role role : roles) { + if (role.hasPermission(permission)) { + return true; + } + + PermissionOverride roleChannelPO = channel.getPermissionOverride(role); + if (roleChannelPO != null) { + if (roleChannelPO.getAllowed().contains(permission)) { + return true; + } + } + + if (parent != null) { + PermissionOverride roleCategeoryPO = parent.getPermissionOverride(role); + if (roleCategeoryPO != null) { + if (roleCategeoryPO.getAllowed().contains(permission)) { + return true; + } + } + } + } + + return false; + } + /** * @return an adjusted list of mentions in case the prefix mention is used to exclude it. This method should always * be used over Message#getMentions() @@ -189,6 +253,11 @@ public boolean hasArguments() { return args.length > 0 && !rawArgs.isEmpty(); } + @Nonnull + public Collection getEnabledModules() { + return FredBoat.getMainDbWrapper().getOrCreate(GuildModules.key(this.guild)).getEnabledModules(); + } + @Nonnull @Override public TextChannel getTextChannel() { diff --git a/FredBoat/src/main/java/fredboat/commandmeta/abs/IMaintenanceCommand.java b/FredBoat/src/main/java/fredboat/commandmeta/abs/IConfigCommand.java similarity index 88% rename from FredBoat/src/main/java/fredboat/commandmeta/abs/IMaintenanceCommand.java rename to FredBoat/src/main/java/fredboat/commandmeta/abs/IConfigCommand.java index 612ebf7fc..0f73ad3f2 100644 --- a/FredBoat/src/main/java/fredboat/commandmeta/abs/IMaintenanceCommand.java +++ b/FredBoat/src/main/java/fredboat/commandmeta/abs/IConfigCommand.java @@ -1,4 +1,5 @@ /* + * * MIT License * * Copyright (c) 2017 Frederik Ar. Mikkelsen @@ -25,9 +26,9 @@ package fredboat.commandmeta.abs; /** - * Created by napster on 23.03.17. + * Created by napster on 09.11.17. *

- * classifies a command as a maintenance/debug command + * Commands that allow guilds / users to change any kind of FredBoat settings */ -public interface IMaintenanceCommand { +public interface IConfigCommand { } diff --git a/FredBoat/src/main/java/fredboat/commandmeta/abs/IDefaultPrefixCommand.java b/FredBoat/src/main/java/fredboat/commandmeta/abs/IInfoCommand.java similarity index 71% rename from FredBoat/src/main/java/fredboat/commandmeta/abs/IDefaultPrefixCommand.java rename to FredBoat/src/main/java/fredboat/commandmeta/abs/IInfoCommand.java index a9a5c3b69..6423e44ba 100644 --- a/FredBoat/src/main/java/fredboat/commandmeta/abs/IDefaultPrefixCommand.java +++ b/FredBoat/src/main/java/fredboat/commandmeta/abs/IInfoCommand.java @@ -20,11 +20,19 @@ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * */ package fredboat.commandmeta.abs; -public interface IDefaultPrefixCommand { - +/** + * Created by napster on 23.03.17. + *

+ * classifies a command as a info/debug command + * + * These are commands that show information, be it debug or help or some links. + * The fine difference to IUtil commands is that the IInfo commands are mostly meta - they provide help / information + * that is needed to run / use FredBoat, while IUtil commands are meant to provide non-FredBoat related value and + * information to users + */ +public interface IInfoCommand { } diff --git a/FredBoat/src/main/java/fredboat/commandmeta/init/MainCommandInitializer.java b/FredBoat/src/main/java/fredboat/commandmeta/init/MainCommandInitializer.java deleted file mode 100644 index 021a5ef61..000000000 --- a/FredBoat/src/main/java/fredboat/commandmeta/init/MainCommandInitializer.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Frederik Ar. Mikkelsen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package fredboat.commandmeta.init; - -import fredboat.command.admin.*; -import fredboat.command.fun.*; -import fredboat.command.maintenance.*; -import fredboat.command.moderation.*; -import fredboat.command.util.*; -import fredboat.commandmeta.CommandRegistry; -import fredboat.util.AsciiArtConstant; -import fredboat.util.rest.OpenWeatherAPI; - -public class MainCommandInitializer { - - public static void initCommands() { - CommandRegistry.registerCommand(new HelpCommand("help", "info")); - CommandRegistry.registerCommand(new CommandsCommand("commands", "comms", "cmds")); - CommandRegistry.registerCommand(new InviteCommand("invite")); - - /* Bot Maintenance */ - CommandRegistry.registerCommand(new UnblacklistCommand("unblacklist", "unlimit")); - CommandRegistry.registerCommand(new VersionCommand("version")); - CommandRegistry.registerCommand(new StatsCommand("uptime", "stats")); - CommandRegistry.registerCommand(new BotRestartCommand("botrestart")); - CommandRegistry.registerCommand(new EvalCommand("eval")); - CommandRegistry.registerCommand(new ShardsCommand("shards")); - CommandRegistry.registerCommand(new ReviveCommand("revive")); - CommandRegistry.registerCommand(new SentryDsnCommand("sentrydsn")); - CommandRegistry.registerCommand(new TestCommand("test")); - CommandRegistry.registerCommand(new GitInfoCommand("gitinfo", "git")); - CommandRegistry.registerCommand(new ExitCommand("exit")); - CommandRegistry.registerCommand(new LeaveServerCommand("leaveserver")); - - /* Moderation */ - CommandRegistry.registerCommand(new HardbanCommand("hardban")); - CommandRegistry.registerCommand(new KickCommand("kick")); - CommandRegistry.registerCommand(new SoftbanCommand("softban")); - CommandRegistry.registerCommand(new ClearCommand("clear")); - CommandRegistry.registerCommand(new PrefixCommand("prefix", "pre")); - - /* Util */ - CommandRegistry.registerCommand(new ServerInfoCommand("serverinfo", "guildinfo")); - CommandRegistry.registerCommand(new UserInfoCommand("userinfo", "memberinfo")); - CommandRegistry.registerCommand(new PingCommand("ping")); - CommandRegistry.registerCommand(new FuzzyUserSearchCommand("fuzzy")); - CommandRegistry.registerCommand(new MathCommand("math")); - - /* Fun Commands */ - CommandRegistry.registerCommand(new JokeCommand("joke", "jk")); - CommandRegistry.registerCommand(new RiotCommand("riot")); - CommandRegistry.registerCommand(new DanceCommand("dance")); - CommandRegistry.registerCommand(new AkinatorCommand("akinator", "aki")); - CommandRegistry.registerCommand(new CatgirlCommand("catgirl", "neko", "catgrill")); - CommandRegistry.registerCommand(new AvatarCommand("avatar", "ava")); - CommandRegistry.registerCommand(new SayCommand("say")); - CommandRegistry.registerCommand(new WeatherCommand(new OpenWeatherAPI(), "weather")); - - /* Other Anime Discord, Sergi memes or any other memes */ - // saved in this album https://imgur.com/a/wYvDu - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/DYToB2e.jpg", "ram")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/utPRe0e.gif", "welcome")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/j8VvjOT.png", "rude")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/oJL7m7m.png", "fuck")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/BrCCbfx.png", "idc")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/jjoz783.png", "beingraped")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/93VahIh.png", "anime")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/w7x1885.png", "wow")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/GNsAxkh.png", "what")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/sBfq3wM.png", "pun")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/pQiT26t.jpg", "cancer")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/YT1Bkhj.png", "stupidbot")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/QmI469j.png", "escape")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/qz6g1vj.gif", "explosion")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/eBUFNJq.gif", "gif")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/mKdTGlg.png", "noods")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/84nbpQe.png", "internetspeed")); - CommandRegistry.registerCommand(new RemoteFileCommand("http://i.imgur.com/i65ss6p.png", "powerpoint")); - - /* Text Faces & Unicode 'Art' & ASCII 'Art' and Stuff */ - CommandRegistry.registerCommand(new TextCommand("¯\\_(ツ)_/¯", "shrug", "shr")); - CommandRegistry.registerCommand(new TextCommand("ಠ_ಠ", "faceofdisapproval", "fod", "disapproving")); - CommandRegistry.registerCommand(new TextCommand("༼ つ ◕_◕ ༽つ", "sendenergy")); - CommandRegistry.registerCommand(new TextCommand("(•\\_•) ( •\\_•)>⌐■-■ (⌐■_■)", "dealwithit", "dwi")); - CommandRegistry.registerCommand(new TextCommand("(ノ◕ヮ◕)ノ*:・゚✧ ✧゚・: *ヽ(◕ヮ◕ヽ)", "channelingenergy")); - CommandRegistry.registerCommand(new TextCommand("Ƹ̵̡Ӝ̵̨̄Ʒ", "butterfly")); - CommandRegistry.registerCommand(new TextCommand("(ノಠ益ಠ)ノ彡┻━┻", "angrytableflip", "tableflipbutangry", "atp")); - CommandRegistry.registerCommand(new TextCommand(AsciiArtConstant.DOG, "dog", "cooldog", "dogmeme")); - CommandRegistry.registerCommand(new TextCommand("T-that's l-lewd, baka!!!", "lewd", "lood", "l00d")); - CommandRegistry.registerCommand(new TextCommand("This command is useless.", "useless")); - CommandRegistry.registerCommand(new TextCommand("¯\\\\(°_o)/¯", "shrugwtf", "swtf")); - CommandRegistry.registerCommand(new TextCommand("ヽ(^o^)ノ", "hurray", "yay", "woot")); - // Lennies - CommandRegistry.registerCommand(new TextCommand("/╲/╭( ͡° ͡° ͜ʖ ͡° ͡°)╮/╱\\", "spiderlenny")); - CommandRegistry.registerCommand(new TextCommand("( ͡° ͜ʖ ͡°)", "lenny")); - CommandRegistry.registerCommand(new TextCommand("┬┴┬┴┤ ͜ʖ ͡°) ├┬┴┬┴", "peeking", "peekinglenny", "peek")); - CommandRegistry.registerCommand(new MagicCommand("magic", "magicallenny", "lennymagical")); - CommandRegistry.registerCommand(new TextCommand(AsciiArtConstant.EAGLE_OF_LENNY, "eagleoflenny", "eol", "lennyeagle")); - - /* Misc - All commands under this line fall in this category */ - - CommandRegistry.registerCommand(new MALCommand("mal")); - CommandRegistry.registerCommand(new BrainfuckCommand("brainfuck")); - - CommandRegistry.registerCommand(new TextCommand("https://github.com/Frederikam", "github")); - CommandRegistry.registerCommand(new TextCommand("https://github.com/Frederikam/FredBoat", "repo")); - - CommandRegistry.registerCommand(new HugCommand("https://imgur.com/a/jHJOc", "hug")); - CommandRegistry.registerCommand(new PatCommand("https://imgur.com/a/WiPTl", "pat")); - CommandRegistry.registerCommand(new FacedeskCommand("https://imgur.com/a/I5Q4U", "facedesk")); - CommandRegistry.registerCommand(new RollCommand("https://imgur.com/a/lrEwS", "roll")); - } - -} diff --git a/FredBoat/src/main/java/fredboat/commandmeta/init/MusicCommandInitializer.java b/FredBoat/src/main/java/fredboat/commandmeta/init/MusicCommandInitializer.java deleted file mode 100644 index 839c3c700..000000000 --- a/FredBoat/src/main/java/fredboat/commandmeta/init/MusicCommandInitializer.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Frederik Ar. Mikkelsen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package fredboat.commandmeta.init; - -import fredboat.command.admin.*; -import fredboat.command.maintenance.*; -import fredboat.command.moderation.*; -import fredboat.command.music.control.*; -import fredboat.command.music.info.*; -import fredboat.command.music.seeking.*; -import fredboat.command.util.*; -import fredboat.commandmeta.CommandRegistry; -import fredboat.perms.PermissionLevel; -import fredboat.util.rest.SearchUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.Collections; - -public class MusicCommandInitializer { - - private static final Logger log = LoggerFactory.getLogger(MusicCommandInitializer.class); - - public static void initCommands() { - CommandRegistry.registerCommand(new HelpCommand("help", "info")); - CommandRegistry.registerCommand(new MusicHelpCommand("music", "musichelp")); - CommandRegistry.registerCommand(new CommandsCommand("commands", "comms", "cmds")); - - /* Control */ - CommandRegistry.registerCommand(new PlayCommand(Arrays.asList(SearchUtil.SearchProvider.YOUTUBE, SearchUtil.SearchProvider.SOUNDCLOUD), - "play", "p")); - CommandRegistry.registerCommand(new PlayCommand(Collections.singletonList(SearchUtil.SearchProvider.YOUTUBE), - "youtube", "yt")); - CommandRegistry.registerCommand(new PlayCommand(Collections.singletonList(SearchUtil.SearchProvider.SOUNDCLOUD), - "soundcloud", "sc")); - CommandRegistry.registerCommand(new SkipCommand("skip", "sk", "s")); - CommandRegistry.registerCommand(new VoteSkipCommand("voteskip", "vsk", "v")); - CommandRegistry.registerCommand(new JoinCommand("join", "summon", "jn", "j")); - CommandRegistry.registerCommand(new LeaveCommand("leave", "lv")); - CommandRegistry.registerCommand(new SelectCommand("select", buildNumericalSelectAllias("sel"))); - CommandRegistry.registerCommand(new StopCommand("stop", "st")); - CommandRegistry.registerCommand(new PauseCommand("pause", "pa", "ps")); - CommandRegistry.registerCommand(new ShuffleCommand("shuffle", "sh", "random")); - CommandRegistry.registerCommand(new ReshuffleCommand("reshuffle", "resh")); - CommandRegistry.registerCommand(new RepeatCommand("repeat", "rep")); - CommandRegistry.registerCommand(new VolumeCommand("volume", "vol")); - CommandRegistry.registerCommand(new UnpauseCommand("unpause", "unp", "resume")); - CommandRegistry.registerCommand(new PlaySplitCommand("split")); - CommandRegistry.registerCommand(new DestroyCommand("destroy")); - - /* Info */ - CommandRegistry.registerCommand(new NowplayingCommand("nowplaying", "np")); - CommandRegistry.registerCommand(new ListCommand("list", "queue", "q", "l")); - CommandRegistry.registerCommand(new HistoryCommand("history", "hist", "h")); - CommandRegistry.registerCommand(new ExportCommand("export", "ex")); - CommandRegistry.registerCommand(new GensokyoRadioCommand("gensokyo", "gr", "gensokyoradio")); - CommandRegistry.registerCommand(new UserInfoCommand("muserinfo")); - - /* Seeking */ - CommandRegistry.registerCommand(new SeekCommand("seek")); - CommandRegistry.registerCommand(new ForwardCommand("forward", "fwd")); - CommandRegistry.registerCommand(new RewindCommand("rewind", "rew")); - CommandRegistry.registerCommand(new RestartCommand("restart", "replay")); - - /* Bot Maintenance Commands */ - CommandRegistry.registerCommand(new GitInfoCommand("mgitinfo", "mgit")); - CommandRegistry.registerCommand(new UnblacklistCommand("munblacklist", "munlimit")); - CommandRegistry.registerCommand(new ExitCommand("mexit")); - CommandRegistry.registerCommand(new LeaveServerCommand("mleaveserver")); - CommandRegistry.registerCommand(new BotRestartCommand("mbotrestart")); - CommandRegistry.registerCommand(new StatsCommand("mstats")); - CommandRegistry.registerCommand(new EvalCommand("meval")); - CommandRegistry.registerCommand(new GetIdCommand("getid")); - CommandRegistry.registerCommand(new PlayerDebugCommand("playerdebug")); - CommandRegistry.registerCommand(new NodesCommand("nodes")); - CommandRegistry.registerCommand(new ShardsCommand("mshards")); - CommandRegistry.registerCommand(new ReviveCommand("mrevive")); - CommandRegistry.registerCommand(new SentryDsnCommand("msentrydsn")); - CommandRegistry.registerCommand(new AudioDebugCommand("adebug")); - CommandRegistry.registerCommand(new AnnounceCommand("announce")); - CommandRegistry.registerCommand(new PingCommand("mping")); - CommandRegistry.registerCommand(new NodeAdminCommand("node")); - CommandRegistry.registerCommand(new GetNodeCommand("getnode")); - CommandRegistry.registerCommand(new DisableCommandsCommand("disable")); - CommandRegistry.registerCommand(new EnableCommandsCommand("enable")); - CommandRegistry.registerCommand(new DebugCommand("debug")); - CommandRegistry.registerCommand(new SetAvatarCommand("setavatar")); - - /* Bot configuration */ - CommandRegistry.registerCommand(new PrefixCommand("prefix", "pre")); - CommandRegistry.registerCommand(new ConfigCommand("config", "cfg")); - CommandRegistry.registerCommand(new LanguageCommand("language", "lang")); - - /* Perms */ - CommandRegistry.registerCommand(new PermissionsCommand(PermissionLevel.ADMIN, "admin")); - CommandRegistry.registerCommand(new PermissionsCommand(PermissionLevel.DJ, "dj")); - CommandRegistry.registerCommand(new PermissionsCommand(PermissionLevel.USER, "user")); - } - - /** - * Build a string array that consist of the max number of searches. - * - * @param extraAliases Aliases to be appended to the rest of the ones being built. - * @return String array that contains string representation of numbers with addOnAliases. - */ - private static String[] buildNumericalSelectAllias(String... extraAliases) { - String[] selectTrackAliases = new String[SearchUtil.MAX_RESULTS + extraAliases.length]; - int i = 0; - for (; i < extraAliases.length; i++) { - selectTrackAliases[i] = extraAliases[i]; - } - for (; i < SearchUtil.MAX_RESULTS + extraAliases.length; i++) { - selectTrackAliases[i] = String.valueOf(i - extraAliases.length + 1); - } - return selectTrackAliases; - } -} diff --git a/FredBoat/src/main/java/fredboat/db/DatabaseManager.java b/FredBoat/src/main/java/fredboat/db/DatabaseManager.java index 9fd32a57f..3486b91e1 100644 --- a/FredBoat/src/main/java/fredboat/db/DatabaseManager.java +++ b/FredBoat/src/main/java/fredboat/db/DatabaseManager.java @@ -28,6 +28,8 @@ import com.zaxxer.hikari.HikariConfig; import fredboat.Config; import fredboat.feature.metrics.Metrics; +import fredboat.shared.constant.BotConstants; +import fredboat.util.DiscordUtil; import net.sf.ehcache.CacheManager; import net.sf.ehcache.config.CacheConfiguration; import net.sf.ehcache.config.PersistenceConfiguration; @@ -71,6 +73,12 @@ public static DatabaseConnection main() throws DatabaseException { //we use flyway db now for migrations, hibernate shall only run validations hibernateProps.put("hibernate.hbm2ddl.auto", "validate"); + //dont run migrations or validate the db from the patron bot + if (DiscordUtil.getBotId() == BotConstants.PATRON_BOT_ID) { + flyway = null; + hibernateProps.put("hibernate.hbm2ddl.auto", "none"); + } + DatabaseConnection databaseConnection = new DatabaseConnection.Builder(MAIN_PERSISTENCE_UNIT_NAME, jdbc) .setHikariConfig(hikariConfig) .setHibernateProps(hibernateProps) @@ -80,7 +88,7 @@ public static DatabaseConnection main() throws DatabaseException { .setSshDetails(Config.CONFIG.getMainSshTunnelConfig()) .setHikariStats(Metrics.instance().hikariStats) .setHibernateStats(Metrics.instance().hibernateStats) - .setCheckConnection(false) + .setCheckConnection(false) //we run our own connection check for this with the DBConnectionWatchdogAgent .setFlyway(flyway) .build(); @@ -124,6 +132,12 @@ public static DatabaseConnection cache() throws DatabaseException { //we use flyway db now for migrations, hibernate shall only run validations hibernateProps.put("hibernate.hbm2ddl.auto", "validate"); + //dont run migrations or validate the db from the patron bot + if (DiscordUtil.getBotId() == BotConstants.PATRON_BOT_ID) { + flyway = null; + hibernateProps.put("hibernate.hbm2ddl.auto", "none"); + } + DatabaseConnection databaseConnection = new DatabaseConnection.Builder(CACHE_PERSISTENCE_UNIT_NAME, cacheJdbc) .setHikariConfig(hikariConfig) .setHibernateProps(hibernateProps) diff --git a/FredBoat/src/main/java/fredboat/db/entity/cache/SearchResult.java b/FredBoat/src/main/java/fredboat/db/entity/cache/SearchResult.java index 29921d257..a28dcd759 100644 --- a/FredBoat/src/main/java/fredboat/db/entity/cache/SearchResult.java +++ b/FredBoat/src/main/java/fredboat/db/entity/cache/SearchResult.java @@ -70,7 +70,7 @@ public class SearchResult implements Serializable { private static final Logger log = LoggerFactory.getLogger(SearchResult.class); - @Id + @EmbeddedId private SearchResultId searchResultId; @Column(name = "timestamp") diff --git a/FredBoat/src/main/java/fredboat/db/entity/main/GuildConfig.java b/FredBoat/src/main/java/fredboat/db/entity/main/GuildConfig.java index 3d916f8f8..300795b39 100644 --- a/FredBoat/src/main/java/fredboat/db/entity/main/GuildConfig.java +++ b/FredBoat/src/main/java/fredboat/db/entity/main/GuildConfig.java @@ -25,20 +25,12 @@ package fredboat.db.entity.main; -import fredboat.FredBoat; -import fredboat.db.DatabaseNotReadyException; import fredboat.db.entity.IEntity; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import space.npstr.sqlsauce.DatabaseException; -import javax.annotation.Nullable; import javax.persistence.*; import java.io.Serializable; -import java.util.List; -import java.util.Optional; @Entity @Table(name = "guild_config") @@ -46,8 +38,6 @@ @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region="guild_config") public class GuildConfig implements IEntity, Serializable { - private static final Logger log = LoggerFactory.getLogger(GuildConfig.class); - private static final long serialVersionUID = 5055243002380106205L; @Id @@ -63,10 +53,6 @@ public class GuildConfig implements IEntity, Serializable { @Column(name = "lang", nullable = false) private String lang = "en_US"; - //may be null to indicate that there is no custom prefix for this guild - @Column(name = "prefix", nullable = true, columnDefinition = "text") - private String prefix; - public GuildConfig(String id) { this.guildId = id; } @@ -107,78 +93,4 @@ public void setLang(String lang) { this.lang = lang; } - @Nullable - public String getPrefix() { - return this.prefix; - } - - public void setPrefix(@Nullable String prefix) { - this.prefix = prefix; - } - - /*@OneToMany - @JoinColumn(name = "guildconfig") - private Set textChannels; - - public GuildConfig(Guild guild) { - this.guildId = Long.parseLong(guild.getId()); - - textChannels = new CopyOnWriteArraySet<>(); - - for (TextChannel tc : guild.getTextChannels()) { - TCConfig tcc = new TCConfig(this, tc); - textChannels.add(tcc); - } - - for (TCConfig tcc : textChannels) { - DatabaseManager.getEntityManager().persist(tcc); - } - } - - public Set getTextChannels() { - return textChannels; - } - - public void addTextChannel(TCConfig tcc){ - textChannels.add(tcc); - } - - public void removeTextChannel(TCConfig tcc){ - textChannels.remove(tcc); - } - - public long getGuildId() { - return guildId; - } - */ - - //shortcut to load the prefix without fetching the whole entity because the prefix will be needed rather often - // without the rest of the guildconfig information - @Nullable - public static Optional getPrefix(long guildId) { - log.debug("loading prefix for guild {}", guildId); - //language=JPAQL - String query = "SELECT gf.prefix FROM GuildConfig gf WHERE gf.guildId = :guildId"; - EntityManager em = null; - try { - em = FredBoat.getMainDbConnection().getEntityManager(); - em.getTransaction().begin(); - List result = em.createQuery(query, String.class) - .setParameter("guildId", Long.toString(guildId)) - .getResultList(); - em.getTransaction().commit(); - if (result.isEmpty()) { - return Optional.empty(); - } else { - return Optional.ofNullable(result.get(0)); - } - } catch (DatabaseException | PersistenceException e) { - log.error("Failed to load prefix for guild {}", guildId, e); - throw new DatabaseNotReadyException(e); - } finally { - if (em != null) { - em.close(); - } - } - } } diff --git a/FredBoat/src/main/java/fredboat/db/entity/main/GuildModules.java b/FredBoat/src/main/java/fredboat/db/entity/main/GuildModules.java new file mode 100644 index 000000000..d61fe0036 --- /dev/null +++ b/FredBoat/src/main/java/fredboat/db/entity/main/GuildModules.java @@ -0,0 +1,231 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.db.entity.main; + +import fredboat.commandmeta.CommandRegistry; +import net.dv8tion.jda.core.entities.Guild; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import space.npstr.sqlsauce.entities.SaucedEntity; +import space.npstr.sqlsauce.fp.types.EntityKey; + +import javax.annotation.CheckReturnValue; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * Created by napster on 29.12.17. + *

+ * There are many more concise ways to persist the module configuration of a guild, here is are reasons for the chosen design: + *

+ * - An entity of it's own: + * To keep the guild config small, and be more flexible. Maybe we want one of these things to be bot specific in the future? + * Having different ehcache regions for both is a bonus. + *

+ * - Each module in a column: + * Alternatives like discord permission style bits in a single long value, or collections/lists of enabled permissions + * lack option to switch between opt-in and opt-out patterns for modules, and having to do any changes or migrations to + * those is more complicated. The possible performance/ressource usage improvement is probably not worth it. + *

+ *

+ * - Nullables Columns + * A null value signals us that a guild has not expressed any preference for a module in any way, or better the other way + * round: Explicitly enabling/disabling a module tells us something about the preferences of our users. If we were to preset + * these values, we would lose this information, and could not switch enabled/disabled modules by default reliably for existing guilds. + */ +@Entity +@Table(name = "guild_modules") +@Cacheable +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region = "guild_modules") +public class GuildModules extends SaucedEntity { + + @Id + @Column(name = "guild_id") + private long guildId; + + @Nullable + @Column(name = "admin", nullable = true) + private Boolean adminModule; //corresponding to CommandRegistry.Module.ADMIN + + @Nullable + @Column(name = "info", nullable = true) + private Boolean infoModule; //corresponding to CommandRegistry.Module.INFO + + @Nullable + @Column(name = "config", nullable = true) + private Boolean configModule; //corresponding to CommandRegistry.Module.CONFIG + + @Nullable + @Column(name = "music", nullable = true) + private Boolean musicModule; //corresponding to CommandRegistry.Module.MUSIC + + @Nullable + @Column(name = "mod", nullable = true) + private Boolean modModule; //corresponding to CommandRegistry.Module.MOD + + @Nullable + @Column(name = "util", nullable = true) + private Boolean utilModule; //corresponding to CommandRegistry.Module.UTIL + + @Nullable + @Column(name = "fun", nullable = true) + private Boolean funModule; //corresponding to CommandRegistry.Module.FUN + + + //for jpa / database wrapper + public GuildModules() { + } + + @Nonnull + public static EntityKey key(@Nonnull Guild guild) { + return EntityKey.of(guild.getIdLong(), GuildModules.class); + } + + @Nonnull + @Override + public GuildModules setId(@Nonnull Long guildId) { + this.guildId = guildId; + return this; + } + + @Nonnull + @Override + public Long getId() { + return guildId; + } + + @Override + public int hashCode() { + return Objects.hashCode(this.guildId); + } + + @Override + public boolean equals(final Object obj) { + return (obj instanceof GuildModules) && ((GuildModules) obj).guildId == this.guildId; + } + + @Nonnull + @CheckReturnValue + public GuildModules enableModule(@Nonnull CommandRegistry.Module module) { + return setModule(module, true); + } + + @Nonnull + @CheckReturnValue + public GuildModules disableModule(@Nonnull CommandRegistry.Module module) { + return setModule(module, false); + } + + @Nonnull + @CheckReturnValue + public GuildModules resetModule(@Nonnull CommandRegistry.Module module) { + return setModule(module, null); + } + + @Nonnull + @CheckReturnValue + private GuildModules setModule(@Nonnull CommandRegistry.Module module, @Nullable Boolean enabled) { + switch (module) { + case ADMIN: + adminModule = enabled; + break; + case INFO: + infoModule = enabled; + break; + case CONFIG: + configModule = enabled; + break; + case MUSIC: + musicModule = enabled; + break; + case MOD: + modModule = enabled; + break; + case UTIL: + utilModule = enabled; + break; + case FUN: + funModule = enabled; + break; + default: + throw new RuntimeException("Unknown Module " + module.name()); + } + return this; + } + + /** + * @return true if the provided module is enabled, false if not, or null if no preference has been set. + */ + @Nullable + public Boolean isModuleEnabled(@Nonnull CommandRegistry.Module module) { + switch (module) { + case ADMIN: + return adminModule; + case INFO: + return infoModule; + case CONFIG: + return configModule; + case MUSIC: + return musicModule; + case MOD: + return modModule; + case UTIL: + return utilModule; + case FUN: + return funModule; + default: + throw new RuntimeException("Unknown Module " + module.name()); + } + } + + /** + * @return true if the provided module is enabled, false if not. If no value has been specified, return the provide + * default value. + */ + public boolean isModuleEnabled(@Nonnull CommandRegistry.Module module, boolean def) { + Boolean enabled = isModuleEnabled(module); + if (enabled != null) { + return enabled; + } else { + return def; + } + } + + @Nonnull + public List getEnabledModules() { + List enabledModules = new ArrayList<>(); + for (CommandRegistry.Module module : CommandRegistry.Module.values()) { + if (isModuleEnabled(module, module.enabledByDefault)) { + enabledModules.add(module); + } + } + return enabledModules; + } +} diff --git a/FredBoat/src/main/java/fredboat/db/entity/main/Prefix.java b/FredBoat/src/main/java/fredboat/db/entity/main/Prefix.java new file mode 100644 index 000000000..473ee9275 --- /dev/null +++ b/FredBoat/src/main/java/fredboat/db/entity/main/Prefix.java @@ -0,0 +1,126 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.db.entity.main; + +import fredboat.FredBoat; +import fredboat.util.DiscordUtil; +import net.dv8tion.jda.core.entities.Guild; +import space.npstr.sqlsauce.entities.GuildBotComposite; +import space.npstr.sqlsauce.entities.SaucedEntity; +import space.npstr.sqlsauce.fp.types.EntityKey; + +import javax.annotation.CheckReturnValue; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.Table; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * Created by napster on 22.12.17. + *

+ * The caching of this entity is not managed by ehcache, instead a guava cache is used, + * see {@link fredboat.command.moderation.PrefixCommand} + */ +@Entity +@Table(name = "prefixes") +public class Prefix extends SaucedEntity { + + @EmbeddedId + private GuildBotComposite id; + + @Nullable + //may be null to indicate that there is no custom prefix for this guild + @Column(name = "prefix", nullable = true, columnDefinition = "text") + private String prefix; + + //for jpa & the database wrapper + public Prefix() { + } + + public Prefix(@Nonnull GuildBotComposite id, @Nullable String prefix) { + this.id = id; + this.prefix = prefix; + } + + @Nonnull + @Override + public Prefix setId(@Nonnull GuildBotComposite id) { + this.id = id; + return this; + } + + @Nonnull + @Override + public GuildBotComposite getId() { + return this.id; + } + + @Nonnull + @Override + public Class getClazz() { + return Prefix.class; + } + + @Nullable + public String getPrefix() { + return this.prefix; + } + + @Nonnull + @CheckReturnValue + public Prefix setPrefix(@Nullable String prefix) { + this.prefix = prefix; + return this; + } + + /** + * Shortcut to creating an entity key for the provided guild and the running bot + */ + public static EntityKey key(@Nonnull Guild guild) { + return EntityKey.of(new GuildBotComposite(guild, DiscordUtil.getBotId()), Prefix.class); + } + + @Nullable + public static Optional getPrefix(long guildId, long botId) { + //language=JPAQL + String query = "SELECT p.prefix FROM Prefix p WHERE p.id = :id"; + Map params = new HashMap<>(); + params.put("id", new GuildBotComposite(guildId, botId)); + + List result = FredBoat.getMainDbWrapper().selectJpqlQuery(query, params, String.class); + if (result.isEmpty()) { + return Optional.empty(); + } else { + return Optional.ofNullable(result.get(0)); + } + } +} diff --git a/FredBoat/src/main/java/fredboat/db/migrations/main/V2__MovePrefixToOwnEntity.java b/FredBoat/src/main/java/fredboat/db/migrations/main/V2__MovePrefixToOwnEntity.java new file mode 100644 index 000000000..5c5db55ba --- /dev/null +++ b/FredBoat/src/main/java/fredboat/db/migrations/main/V2__MovePrefixToOwnEntity.java @@ -0,0 +1,92 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.db.migrations.main; + +import fredboat.util.DiscordUtil; +import org.flywaydb.core.api.migration.jdbc.JdbcMigration; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; + +/** + * Created by napster on 23.12.17. + */ +public class V2__MovePrefixToOwnEntity implements JdbcMigration { + + private static final String DROP = "DROP TABLE IF EXISTS public.prefixes"; + + private static final String CREATE + = "CREATE TABLE public.prefixes " + + "( " + + " guild_id BIGINT NOT NULL, " + + " bot_id BIGINT NOT NULL, " + + " prefix TEXT COLLATE pg_catalog.\"default\", " + + " CONSTRAINT prefixes_pkey PRIMARY KEY (guild_id, bot_id) " + + ");"; + + private static final String SELECT + = "SELECT guild_config.guildid, guild_config.prefix " + + "FROM guild_config " + + "WHERE guild_config.prefix IS NOT NULL"; + + private static final String INSERT + = "INSERT INTO prefixes(guild_id, bot_id, prefix) VALUES(?, ?, ?)"; + + @Override + public void migrate(Connection connection) throws Exception { + + try (Statement drop = connection.createStatement()) { + drop.execute(DROP); + } + + try (Statement create = connection.createStatement()) { + create.execute(CREATE); + } + + long botId = DiscordUtil.getBotId(); + try (Statement select = connection.createStatement()) { + + try (ResultSet prefixes = select.executeQuery(SELECT)) { + while (prefixes.next()) { + long guildId = prefixes.getLong(1); + String prefix = prefixes.getString(2); + + if (prefix != null) { + try (PreparedStatement insert = connection.prepareStatement(INSERT)) { + insert.setLong(1, guildId); + insert.setLong(2, botId); + insert.setString(3, prefix); + + insert.executeUpdate(); + } + } + } + } + } + } +} diff --git a/FredBoat/src/main/java/fredboat/db/migrations/main/V3__CommandModules.java b/FredBoat/src/main/java/fredboat/db/migrations/main/V3__CommandModules.java new file mode 100644 index 000000000..da55b70d1 --- /dev/null +++ b/FredBoat/src/main/java/fredboat/db/migrations/main/V3__CommandModules.java @@ -0,0 +1,64 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.db.migrations.main; + +import org.flywaydb.core.api.migration.jdbc.JdbcMigration; + +import java.sql.Connection; +import java.sql.Statement; + +/** + * Created by napster on 29.12.17. + */ +public class V3__CommandModules implements JdbcMigration { + + private static final String DROP + = "DROP TABLE IF EXISTS public.guild_modules;"; + + private static final String CREATE + = "CREATE TABLE public.guild_modules " + + "( " + + " guild_id BIGINT NOT NULL, " + + " admin BOOLEAN, " + + " info BOOLEAN, " + + " config BOOLEAN, " + + " music BOOLEAN, " + + " mod BOOLEAN, " + + " util BOOLEAN, " + + " fun BOOLEAN, " + + " CONSTRAINT guild_modules_pkey PRIMARY KEY (guild_id) " + + ");"; + + @Override + public void migrate(Connection connection) throws Exception { + try (Statement drop = connection.createStatement()) { + drop.execute(DROP); + } + try (Statement create = connection.createStatement()) { + create.execute(CREATE); + } + } +} diff --git a/FredBoat/src/main/java/fredboat/event/EventListenerBoat.java b/FredBoat/src/main/java/fredboat/event/EventListenerBoat.java index 797f27256..6e8a826c7 100644 --- a/FredBoat/src/main/java/fredboat/event/EventListenerBoat.java +++ b/FredBoat/src/main/java/fredboat/event/EventListenerBoat.java @@ -29,27 +29,27 @@ import fredboat.Config; import fredboat.audio.player.GuildPlayer; import fredboat.audio.player.PlayerRegistry; -import fredboat.command.maintenance.ShardsCommand; -import fredboat.command.maintenance.StatsCommand; +import fredboat.command.info.HelpCommand; +import fredboat.command.info.ShardsCommand; +import fredboat.command.info.StatsCommand; import fredboat.command.music.control.SkipCommand; -import fredboat.command.util.HelpCommand; +import fredboat.commandmeta.CommandInitializer; import fredboat.commandmeta.CommandManager; +import fredboat.commandmeta.CommandRegistry; import fredboat.commandmeta.abs.CommandContext; import fredboat.db.EntityReader; import fredboat.feature.I18n; import fredboat.feature.metrics.Metrics; import fredboat.feature.togglz.FeatureFlags; import fredboat.messaging.CentralMessaging; +import fredboat.perms.PermissionLevel; +import fredboat.perms.PermsUtil; import fredboat.util.DiscordUtil; import fredboat.util.TextUtils; import fredboat.util.Tuple2; import fredboat.util.ratelimit.Ratelimiter; import io.prometheus.client.Histogram; -import net.dv8tion.jda.core.entities.Guild; -import net.dv8tion.jda.core.entities.Member; -import net.dv8tion.jda.core.entities.Message; -import net.dv8tion.jda.core.entities.TextChannel; -import net.dv8tion.jda.core.entities.VoiceChannel; +import net.dv8tion.jda.core.entities.*; import net.dv8tion.jda.core.events.guild.GuildLeaveEvent; import net.dv8tion.jda.core.events.guild.voice.GuildVoiceJoinEvent; import net.dv8tion.jda.core.events.guild.voice.GuildVoiceLeaveEvent; @@ -119,7 +119,7 @@ private void doOnMessageReceived(MessageReceivedEvent event) { //preliminary permission filter to avoid a ton of parsing //let messages pass on to parsing that contain "help" since we want to answer help requests even from channels // where we can't talk in - if (!channel.canTalk() && !event.getMessage().getRawContent().toLowerCase().contains("help")) { + if (!channel.canTalk() && !event.getMessage().getRawContent().toLowerCase().contains(CommandInitializer.HELP_COMM_NAME)) { return; } @@ -131,12 +131,24 @@ private void doOnMessageReceived(MessageReceivedEvent event) { //ignore all commands in channels where we can't write, except for the help command if (!channel.canTalk() && !(context.command instanceof HelpCommand)) { - log.info("Ignored command because this bot cannot write in that channel"); + log.info("Ignoring command {} because this bot cannot write in that channel", context.command.name); return; } Metrics.commandsReceived.labels(context.command.getClass().getSimpleName()).inc(); + //BOT_ADMINs can always use all commands everywhere + if (!PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, event.getMember())) { + + //ignore commands of disabled modules for plebs + CommandRegistry.Module module = context.command.getModule(); + if (module != null && !context.getEnabledModules().contains(module)) { + log.debug("Ignoring command {} because its module {} is disabled in guild {}", + context.command.name, module.name(), event.getGuild().getIdLong()); + return; + } + } + limitOrExecuteCommand(context); } @@ -168,7 +180,7 @@ private void limitOrExecuteCommand(CommandContext context) { if (ratelimiterResult.b == SkipCommand.class) { //we can compare classes with == as long as we are using the same classloader (which we are) //add a nice reminder on how to skip more than 1 song out += "\n" + context.i18nFormat("ratelimitedSkipCommand", - "`" + TextUtils.escapeMarkdown(context.getPrefix()) + "skip n-m`"); + "`" + TextUtils.escapeMarkdown(context.getPrefix()) + CommandInitializer.SKIP_COMM_NAME + " n-m`"); } context.replyWithMention(out); } diff --git a/FredBoat/src/main/java/fredboat/event/EventLogger.java b/FredBoat/src/main/java/fredboat/event/EventLogger.java index 44ab3bb81..7ccbfc51f 100644 --- a/FredBoat/src/main/java/fredboat/event/EventLogger.java +++ b/FredBoat/src/main/java/fredboat/event/EventLogger.java @@ -44,7 +44,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.time.LocalDateTime; +import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -211,7 +211,7 @@ private void sendGuildStats() { } EmbedBuilder eb = CentralMessaging.getColoredEmbedBuilder() - .setTimestamp(LocalDateTime.now()) + .setTimestamp(OffsetDateTime.now()) .setTitle("Joins and Leaves since the last update") .addField("Guilds joined", Integer.toString(guildsJoinedEvents.getAndSet(0)), true) .addField("Guilds left", Integer.toString(guildsLeftEvents.getAndSet(0)), true); diff --git a/FredBoat/src/main/java/fredboat/feature/AkinatorListener.java b/FredBoat/src/main/java/fredboat/feature/AkinatorListener.java index a523acfbd..f441849d2 100644 --- a/FredBoat/src/main/java/fredboat/feature/AkinatorListener.java +++ b/FredBoat/src/main/java/fredboat/feature/AkinatorListener.java @@ -95,7 +95,7 @@ private void checkTimeout() { } private void sendNextQuestion() { - String name = TextUtils.escapeMarkdown(context.getMember().getEffectiveName()); + String name = TextUtils.escapeAndDefuse(context.getMember().getEffectiveName()); String out = "**" + name + ": Question " + (stepInfo.getStepNum() + 1) + "**\n" + stepInfo.getQuestion() + "\n [yes/no/idk/probably/probably not]"; context.reply(out); diff --git a/FredBoat/src/main/java/fredboat/feature/PatronageChecker.java b/FredBoat/src/main/java/fredboat/feature/PatronageChecker.java index 998bb9a29..bdde4cdbb 100644 --- a/FredBoat/src/main/java/fredboat/feature/PatronageChecker.java +++ b/FredBoat/src/main/java/fredboat/feature/PatronageChecker.java @@ -31,6 +31,7 @@ import fredboat.Config; import fredboat.feature.metrics.Metrics; import fredboat.shared.constant.DistributionEnum; +import fredboat.util.rest.CacheUtil; import fredboat.util.rest.Http; import net.dv8tion.jda.core.entities.Guild; import org.json.JSONObject; @@ -71,7 +72,7 @@ public PatronageChecker() { } public Status getStatus(Guild guild) { - return cache.getUnchecked(guild.getId()); + return CacheUtil.getUncheckedUnwrapped(cache, guild.getId()); } public class Status { diff --git a/FredBoat/src/main/java/fredboat/feature/metrics/Metrics.java b/FredBoat/src/main/java/fredboat/feature/metrics/Metrics.java index 8e74398c7..1dc772d36 100644 --- a/FredBoat/src/main/java/fredboat/feature/metrics/Metrics.java +++ b/FredBoat/src/main/java/fredboat/feature/metrics/Metrics.java @@ -30,8 +30,8 @@ import fredboat.FredBoat; import fredboat.agent.FredBoatAgent; import fredboat.audio.player.VideoSelection; -import fredboat.command.moderation.PrefixCommand; -import fredboat.command.util.HelpCommand; +import fredboat.command.config.PrefixCommand; +import fredboat.command.info.HelpCommand; import fredboat.feature.metrics.collectors.FredBoatCollector; import fredboat.feature.metrics.collectors.ThreadPoolCollector; import io.prometheus.client.Counter; diff --git a/FredBoat/src/main/java/fredboat/feature/metrics/collectors/FredBoatCollector.java b/FredBoat/src/main/java/fredboat/feature/metrics/collectors/FredBoatCollector.java index 53dcc771c..41140a408 100644 --- a/FredBoat/src/main/java/fredboat/feature/metrics/collectors/FredBoatCollector.java +++ b/FredBoat/src/main/java/fredboat/feature/metrics/collectors/FredBoatCollector.java @@ -45,7 +45,7 @@ public class FredBoatCollector extends Collector { public List collect() { List mfs = new ArrayList<>(); - List labelNames = Arrays.asList("shard", "entity"); //todo decide on 2nd label name + List labelNames = Arrays.asList("shard", "entity"); GaugeMetricFamily jdaEntities = new GaugeMetricFamily("fredboat_jda_entities", "Amount of JDA entities", labelNames); diff --git a/FredBoat/src/main/java/fredboat/feature/togglz/FeatureFlags.java b/FredBoat/src/main/java/fredboat/feature/togglz/FeatureFlags.java index 10c41a868..13fd0d013 100644 --- a/FredBoat/src/main/java/fredboat/feature/togglz/FeatureFlags.java +++ b/FredBoat/src/main/java/fredboat/feature/togglz/FeatureFlags.java @@ -58,6 +58,7 @@ public enum FeatureFlags implements Feature { @Label("Full instrumentation, including multidimensional per command stats") FULL_METRICS, + ; public boolean isActive() { diff --git a/FredBoat/src/main/java/fredboat/messaging/internal/Context.java b/FredBoat/src/main/java/fredboat/messaging/internal/Context.java index 236d4f790..979dd0a47 100644 --- a/FredBoat/src/main/java/fredboat/messaging/internal/Context.java +++ b/FredBoat/src/main/java/fredboat/messaging/internal/Context.java @@ -25,7 +25,7 @@ package fredboat.messaging.internal; -import fredboat.command.moderation.PrefixCommand; +import fredboat.command.config.PrefixCommand; import fredboat.commandmeta.MessagingException; import fredboat.feature.I18n; import fredboat.feature.metrics.Metrics; @@ -120,12 +120,21 @@ public MessageFuture replyFile(@Nonnull File file, @Nullable Message message) { } @SuppressWarnings("UnusedReturnValue") - public MessageFuture replyImage(@Nonnull String url, @Nullable String message) { - return CentralMessaging.sendMessage(getTextChannel(), + public MessageFuture replyImage(@Nonnull String url, @Nullable String message, @Nullable Consumer onSuccess) { + return CentralMessaging.sendMessage( + getTextChannel(), CentralMessaging.getClearThreadLocalMessageBuilder() .setEmbed(embedImage(url)) .append(message != null ? message : "") - .build()); + .build(), + onSuccess + ); + } + + + @SuppressWarnings("UnusedReturnValue") + public MessageFuture replyImage(@Nonnull String url, @Nullable String message) { + return replyImage(url, message, null); } @SuppressWarnings("UnusedReturnValue") diff --git a/FredBoat/src/main/java/fredboat/perms/PermsUtil.java b/FredBoat/src/main/java/fredboat/perms/PermsUtil.java index 8b07b3146..6049b0480 100644 --- a/FredBoat/src/main/java/fredboat/perms/PermsUtil.java +++ b/FredBoat/src/main/java/fredboat/perms/PermsUtil.java @@ -34,10 +34,12 @@ import net.dv8tion.jda.core.Permission; import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.Role; -import net.dv8tion.jda.core.utils.PermissionUtil; import java.util.List; +/** + * This class provides utility methods for FredBoat's own permission system, **not** the Discord permission system. + */ public class PermsUtil { public static PermissionLevel getPerms(Member member) { @@ -45,12 +47,12 @@ public static PermissionLevel getPerms(Member member) { return PermissionLevel.BOT_OWNER; // https://fred.moe/Q-EB.png } else if (isBotAdmin(member)) { return PermissionLevel.BOT_ADMIN; - } else if (PermissionUtil.checkPermission(member, Permission.ADMINISTRATOR)) { + } else if (member.hasPermission(Permission.ADMINISTRATOR)) { return PermissionLevel.ADMIN; } if (!FeatureFlags.PERMISSIONS.isActive()) { - return PermissionUtil.checkPermission(member, Permission.MESSAGE_MANAGE) ? PermissionLevel.DJ : PermissionLevel.USER; + return member.hasPermission(Permission.MESSAGE_MANAGE) ? PermissionLevel.DJ : PermissionLevel.USER; } GuildPermissions gp = EntityReader.getGuildPermissions(member.getGuild()); @@ -100,7 +102,7 @@ private static boolean isBotAdmin(Member member) { } public static boolean checkList(List list, Member member) { - if (PermissionUtil.checkPermission(member, Permission.ADMINISTRATOR)) return true; + if (member.hasPermission(Permission.ADMINISTRATOR)) return true; for (String id : list) { if (id.isEmpty()) continue; diff --git a/FredBoat/src/main/java/fredboat/util/ArgumentUtil.java b/FredBoat/src/main/java/fredboat/util/ArgumentUtil.java index 5b286dbe5..8b8138d40 100644 --- a/FredBoat/src/main/java/fredboat/util/ArgumentUtil.java +++ b/FredBoat/src/main/java/fredboat/util/ArgumentUtil.java @@ -32,8 +32,10 @@ import net.dv8tion.jda.core.entities.Role; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class ArgumentUtil { @@ -89,26 +91,84 @@ public static Member checkSingleFuzzyMemberSearchResult(CommandContext context, case 1: return list.get(0); default: - StringBuilder searchResults = new StringBuilder(); - int maxIndex = Math.min(FUZZY_RESULT_LIMIT, list.size()); - for (int i = 0; i < maxIndex; i++) { - searchResults.append("\n") - .append(list.get(i).getUser().getName()) - .append("#") - .append(list.get(i).getUser().getDiscriminator()); - } - - if (list.size() > FUZZY_RESULT_LIMIT) { - searchResults.append("\n[...]"); - } - context.reply(context.i18n("fuzzyMultiple") + "\n" - + TextUtils.asCodeBlock(searchResults.toString())); + + formatFuzzyMemberResult(list, FUZZY_RESULT_LIMIT, 1900)); return null; } } - public static IMentionable checkSingleFuzzySearchResult(List list, CommandContext context, String term) { + /** + * Format a list of members as a text block, usually a result from a fuzzy search. The list should not be empty. + * + * @param maxLines How many results to display. Pass Integer.MAX_VALUE to use as many as possible. + * @param maxLength How many characters the resulting string may have as a max. + */ + @Nonnull + public static String formatFuzzyMemberResult(@Nonnull List list, int maxLines, int maxLength) { + + List toDisplay; + boolean addDots = false; + if (list.size() > maxLines) { + addDots = true; + toDisplay = list.subList(0, maxLines); + } else { + toDisplay = new ArrayList<>(list); + } + + int idPadding = toDisplay.stream() + .mapToInt(member -> member.getUser().getId().length()) + .max() + .orElse(0); + int namePadding = toDisplay.stream() + .mapToInt(member -> TextUtils.escapeBackticks(member.getUser().getName()).length()) + .max() + .orElse(0) + + 5;//for displaying discrim + int nickPadding = toDisplay.stream() + .mapToInt(member -> member.getNickname() != null ? TextUtils.escapeBackticks(member.getNickname()).length() : 0) + .max() + .orElse(0); + + List lines = toDisplay.stream() + .map(member -> TextUtils.padWithSpaces(member.getUser().getId(), idPadding, true) + + " " + TextUtils.padWithSpaces(TextUtils.escapeBackticks(member.getUser().getName()) + + "#" + member.getUser().getDiscriminator(), namePadding, false) + + " " + TextUtils.escapeBackticks(TextUtils.padWithSpaces(member.getNickname(), nickPadding, false)) + + "\n") + .collect(Collectors.toList()); + + + StringBuilder sb = new StringBuilder(TextUtils.padWithSpaces("Id", idPadding + 1, false) + + TextUtils.padWithSpaces("Name", namePadding + 1, false) + + TextUtils.padWithSpaces("Nick", nickPadding + 1, false) + "\n"); + + int textBlockLength = 8; + String dotdotdot = "[...]"; + for (int i = 0; i < toDisplay.size(); i++) { + String line = lines.get(i); + if (sb.length() + line.length() + dotdotdot.length() + textBlockLength < maxLength) { + sb.append(line); + } else { + sb.append(dotdotdot); + addDots = false; //already added + break; + } + } + if (addDots) { + sb.append(dotdotdot); + } + + return TextUtils.asCodeBlock(sb.toString()); + } + + /** + * Processes a list of mentionables (roles / users). + * Replies in the context of there are none / more than one mentionable and returns null, otherwise returns the + * single mentionable. + */ + @Nullable + public static IMentionable checkSingleFuzzySearchResult(@Nonnull List list, + @Nonnull CommandContext context, @Nonnull String term) { switch (list.size()) { case 0: context.reply(context.i18nFormat("fuzzyNothingFound", term)); diff --git a/FredBoat/src/main/java/fredboat/util/DiscordUtil.java b/FredBoat/src/main/java/fredboat/util/DiscordUtil.java index 1c85e3714..824f54544 100644 --- a/FredBoat/src/main/java/fredboat/util/DiscordUtil.java +++ b/FredBoat/src/main/java/fredboat/util/DiscordUtil.java @@ -34,6 +34,7 @@ import fredboat.feature.I18n; import fredboat.feature.metrics.Metrics; import fredboat.shared.constant.BotConstants; +import fredboat.util.rest.CacheUtil; import fredboat.util.rest.Http; import net.dv8tion.jda.bot.entities.ApplicationInfo; import net.dv8tion.jda.core.JDA; @@ -58,8 +59,8 @@ public class DiscordUtil { private static final Logger log = LoggerFactory.getLogger(DiscordUtil.class); - private static final String USER_AGENT = String.format("DiscordBot (https://github.com/Frederikam/FredBoat, %s)", - AppInfo.getAppInfo().getVersionBuild()); + private static final String USER_AGENT = String.format("DiscordBot (%s, %s)", + BotConstants.GITHUB_URL, AppInfo.getAppInfo().getVersionBuild()); private static volatile DiscordAppInfo selfDiscordAppInfo; //access this object through getApplicationInfo(jda) private static final Object selfDiscordAppInfoLock = new Object(); @@ -146,7 +147,7 @@ public static DiscordAppInfo getApplicationInfo(@Nonnull JDA jda) { //uses our configured bot token to retrieve our own userid public static long getBotId() { - return BOT_ID.getUnchecked(Config.CONFIG.getBotToken()); + return CacheUtil.getUncheckedUnwrapped(BOT_ID, Config.CONFIG.getBotToken()); } private static long getUserId(@Nonnull String token) { diff --git a/FredBoat/src/main/java/fredboat/util/Emojis.java b/FredBoat/src/main/java/fredboat/util/Emojis.java index 020f2327a..75432042f 100644 --- a/FredBoat/src/main/java/fredboat/util/Emojis.java +++ b/FredBoat/src/main/java/fredboat/util/Emojis.java @@ -35,5 +35,12 @@ public class Emojis { public static final String BAD = "❌"; public static final String PENCIL = "📝"; public static final String DOOR = "🚪"; - + public static final String LOCK = "🔒"; + public static final String INFO = "ℹ"; + public static final String MUSIC = "🎵"; + public static final String HAMMER = "🔨"; + public static final String GEAR = "⚙"; + public static final String KEY = "🔑"; + public static final String DIE = "🎲"; + public static final String TOOLS = "🛠"; } diff --git a/FredBoat/src/main/java/fredboat/util/TextUtils.java b/FredBoat/src/main/java/fredboat/util/TextUtils.java index 9a0fc0070..5e17dd550 100644 --- a/FredBoat/src/main/java/fredboat/util/TextUtils.java +++ b/FredBoat/src/main/java/fredboat/util/TextUtils.java @@ -38,6 +38,8 @@ import net.dv8tion.jda.core.entities.Message; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import org.apache.commons.text.CharacterPredicates; +import org.apache.commons.text.RandomStringGenerator; import org.json.JSONException; import org.slf4j.LoggerFactory; @@ -48,10 +50,7 @@ import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -62,7 +61,8 @@ public class TextUtils { private static final Pattern TIMESTAMP_PATTERN = Pattern.compile("^(\\d?\\d)(?::([0-5]?\\d))?(?::([0-5]?\\d))?$"); - private static final List markdownChars = Arrays.asList('*', '`', '~', '_'); + private static final Collection BACKTICK = Collections.singleton('`'); + private static final List MARKDOWN_CHARS = Arrays.asList('*', '`', '~', '_'); public static final CharMatcher SPLIT_SELECT_SEPARATOR = CharMatcher.whitespace().or(CharMatcher.is(',')) @@ -89,7 +89,7 @@ private TextUtils() { public static Message prefaceWithName(Member member, String msg) { msg = ensureSpace(msg); return CentralMessaging.getClearThreadLocalMessageBuilder() - .append(escapeMarkdown(member.getEffectiveName())) + .append(escapeAndDefuse(member.getEffectiveName())) .append(": ") .append(msg) .build(); @@ -270,10 +270,10 @@ public static String asCodeBlock(String str, String... style) { return "```" + sty + "\n" + str + "\n```"; } - public static String escapeMarkdown(String str) { - StringBuilder revisedString = new StringBuilder(str.length()); - for (Character n : str.toCharArray()) { - if (markdownChars.contains(n)) { + public static String escape(@Nonnull String input, @Nonnull Collection toEscape) { + StringBuilder revisedString = new StringBuilder(input.length()); + for (Character n : input.toCharArray()) { + if (toEscape.contains(n)) { revisedString.append("\\"); } revisedString.append(n); @@ -281,6 +281,14 @@ public static String escapeMarkdown(String str) { return revisedString.toString(); } + public static String escapeMarkdown(@Nonnull String input) { + return escape(input, MARKDOWN_CHARS); + } + + public static String escapeBackticks(@Nonnull String input) { + return escape(input, BACKTICK); + } + public static String forceNDigits(int i, int n) { String str = Integer.toString(i); @@ -383,4 +391,26 @@ public static String defuseMentions(@Nonnull String input) { return input.replaceAll("@here", "@" + ZERO_WIDTH_CHAR + "here") .replaceAll("@everyone", "@" + ZERO_WIDTH_CHAR + "everyone"); } + + /** + * @return the input, with escaped markdown and defused mentions + * It is a good idea to use this on any user generated values that we reply in plain text. + */ + @Nonnull + public static String escapeAndDefuse(@Nonnull String input) { + return defuseMentions(escapeMarkdown(input)); + } + + @Nonnull + private static RandomStringGenerator randomStringGenerator = new RandomStringGenerator.Builder() + .withinRange('0', 'z') + .filteredBy(CharacterPredicates.LETTERS, CharacterPredicates.DIGITS) + .build(); + + public static String randomAlphaNumericString(int length) { + if (length < 1) { + throw new IllegalArgumentException(); + } + return randomStringGenerator.generate(length); + } } diff --git a/FredBoat/src/main/java/fredboat/util/ratelimit/Ratelimiter.java b/FredBoat/src/main/java/fredboat/util/ratelimit/Ratelimiter.java index 445c623d1..756ac2e1a 100644 --- a/FredBoat/src/main/java/fredboat/util/ratelimit/Ratelimiter.java +++ b/FredBoat/src/main/java/fredboat/util/ratelimit/Ratelimiter.java @@ -27,7 +27,7 @@ import fredboat.Config; import fredboat.FredBoat; import fredboat.audio.queue.PlaylistInfo; -import fredboat.command.maintenance.ShardsCommand; +import fredboat.command.info.ShardsCommand; import fredboat.command.music.control.SkipCommand; import fredboat.command.util.WeatherCommand; import fredboat.commandmeta.abs.Command; diff --git a/FredBoat/src/main/java/fredboat/util/rest/CacheUtil.java b/FredBoat/src/main/java/fredboat/util/rest/CacheUtil.java index b62d2f8dd..87b6f2535 100644 --- a/FredBoat/src/main/java/fredboat/util/rest/CacheUtil.java +++ b/FredBoat/src/main/java/fredboat/util/rest/CacheUtil.java @@ -25,6 +25,9 @@ package fredboat.util.rest; +import com.google.common.base.Throwables; +import com.google.common.cache.LoadingCache; +import com.google.common.util.concurrent.UncheckedExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,4 +81,14 @@ public static File getImageFromURL(final String url) { } } + public static V getUncheckedUnwrapped(LoadingCache cache, K key) { + try { + return cache.getUnchecked(key); + } catch (UncheckedExecutionException e) { + Throwables.throwIfUnchecked(e.getCause()); + + // Will never run. + throw new IllegalStateException(e); + } + } } diff --git a/FredBoat/src/main/resources/ehcache_cache.xml b/FredBoat/src/main/resources/ehcache_cache.xml index b71010032..8620366f0 100644 --- a/FredBoat/src/main/resources/ehcache_cache.xml +++ b/FredBoat/src/main/resources/ehcache_cache.xml @@ -42,10 +42,10 @@ - + - + + + + + - + ''. {0}% is die verstek. Die speler is tans by * *{1}% * *. volumeSuccess=Verander volume uit * *{0}% * * tot * *{1}% * *. exportEmpty=Niks uitvoer, die tou is leeg. @@ -127,6 +127,7 @@ luaTimeout=\ Funksie \:anger\: toegelaat aanspreeklikheid verstreke tyd is {0} s helpSuccess=Dokumentasie is na jou direkte boodskappe gestuur\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=S\u00ea {0} om te leer wat hierdie bot kan doen\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Geen sodanige gebruikers brainfuckCycleLimit=Program oorskry die maksimum siklus telling van {0} brainfuckDataPointerOutOfBounds=Data wyser verbode\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderering commandsMaintenance=Onderhoud commandsBotOwner=Bot eienaar commandsMoreHelp=S\u00ea {0} om meer inligting oor ''n spesifieke opdrag te kry. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Onbekende bevel. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Behoorlike gebruik\: helpCommandOwnerRestricted=Hierdie bevel is beperk tot die eienaar van die bot. helpConfigCommand=Wys die konfigurasie van hierdie guild of Verstel instellings. helpLanguageCommand=Wys beskikbare tale of stel 'n taal vir hierdie Gilde. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Verbied 'n gebruiker sy boodskappe in en skrap uit die afgelope 7 dae. helpKickCommand=Skop 'n gebruiker van hierdie Gilde. helpSoftbanCommand=Softban 'n gebruiker deur skop hom en skrapping van sy boodskappe uit die afgelope 7 dae. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/ar_SA.properties b/FredBoat/src/main/resources/lang/ar_SA.properties index 0151e0d27..6745f6dbb 100644 --- a/FredBoat/src/main/resources/lang/ar_SA.properties +++ b/FredBoat/src/main/resources/lang/ar_SA.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\ unpausePlayerNotPaused=\u0627\u0644\u0644\u0627\u0639\u0628 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0641. unpauseNoUsers=\u0644\u0627 \u064a\u0648\u062c\u062f \u0623\u0634\u062e\u0627\u0635 \u0641\u064a \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629 \u0627\u0644\u0635\u0648\u062a\u064a\u0629. unpauseSuccess=\u0627\u0644\u0627\u0639\u0628 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0641 \u0627\u0644\u0622\u0646. -volumeApology=\u0645\u0639\u0630\u0631\u0629\! \u061b\u061b \u0627\u0644\u0622\u0646 \u062a\u0645 \u0625\u0647\u0645\u0627\u0644 \u0627\u0644\u0623\u0645\u0631 \u0648\u062d\u062f\u0629 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0639\u0644\u0649 \u0628\u0648\u062a \u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0649 \u0627\u0644\u0639\u0627\u0645\u0629. \u0647\u0630\u0627 \u0628\u0633\u0628\u0628 \u0643\u064a\u0641 \u0623\u0646\u0647 \u064a\u0633\u0628\u0628 \u0627\u0644\u0644\u0627\u0639\u0628 \u0642\u0636\u0627\u0621 \u0627\u0644\u0643\u062b\u064a\u0631 \u0645\u0646 \u0627\u0644\u0648\u0642\u062a \u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0635\u0648\u062a\u060c \u0648\u0628\u0639\u0636 \u0627\u0644\u0645\u0633\u0627\u0631\u0627\u062a \u064a\u0635\u0644 \u0625\u0644\u0649 5 \u0645\u0631\u0627\u062a\u060c \u0645\u0645\u0627 \u062a\u0633\u0628\u0628 \u0641\u064a \u0627\u0644\u062c\u0645\u064a\u0639 \u0644\u0633\u0645\u0627\u0639 \u062a\u0644\u0639\u062b\u0645. \u0639\u0646 \u0637\u0631\u064a\u0642 \u062a\u0639\u0637\u064a\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u064a\u0632\u0629 \u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a \u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0644\u0639\u0628 \u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0649 \u0623\u0643\u062b\u0631 \u0628\u062f\u0648\u0646 \u062a\u0623\u062e\u064a\u0631. \u0648\u0623\u0648\u0635\u0649 \u0628\u062a\u062d\u062f\u064a\u062f \u0645\u0633\u062a\u0648\u0649 \u0635\u0648\u062a \u0627\u0644\u0628\u0648\u062a \u0639\u0646 \u0637\u0631\u064a\u0642 https\://fred.moe/1vD.png \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0646\u0633\u062f\u0644\u0629 +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\u0627\u0633\u062a\u062e\u062f\u0627\u0645 ''\u061b\u061b \u062d\u062c\u0645 <0-150> ''-{0}% \u0647\u0648 \u0627\u0644\u0625\u0639\u062f\u0627\u062f \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a. \u0627\u0644\u0644\u0627\u0639\u0628 \u062d\u0627\u0644\u064a\u0627 \u0641\u064a * *{1}% * *. volumeSuccess=\u062a\u063a\u064a\u064a\u0631 \u0627\u0644\u062d\u062c\u0645 \u0645\u0646 * *{0}% * * \u0625\u0644\u0649 * *{1}% * *. exportEmpty=\u0644\u0627 \u0639\u0644\u0627\u0642\u0629 \u0644\u0647 \u0628\u0627\u0644\u062a\u0635\u062f\u064a\u0631\u060c \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u063a\u064a\u0631 \u0641\u0627\u0631\u063a. @@ -127,6 +127,7 @@ luaTimeout=\ \u0645\u0647\u0644\u0629 \u062f\u0627\u0644\u0629 \:anger\: \u064a\ helpSuccess=\u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0648\u062b\u0627\u0626\u0642 \u0625\u0644\u0649 \u0631\u0633\u0627\u0626\u0644\u0643 \u0627\u0644\u0645\u0628\u0627\u0634\u0631\u0629\!\n \n\u0627\u0644\u0633\u064a\u0627\u0642 | \u0633\u064a\u0627\u0642 \u0627\u0644\u0637\u0644\u0628\! helpDmFailed=\u062a\u0639\u0630\u0631 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0645\u0633\u062a\u0646\u062f \u0641\u064a \u0627\u0644 \u062f\u0645 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643. \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0639\u062f\u0645 \u062a\u0639\u0637\u064a\u0644\u0647\u0627\! helpCommandsPromotion=\u0642\u0648\u0644 {0} \u0644\u0645\u0639\u0631\u0641\u0629 \u0645\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u0642\u064a\u0627\u0645 \u0628\u0647 \u0647\u0630\u0627 \u0628\u0648\u062a\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=\u0644\u0627 \u064a\u0648\u062c\u062f \u0645\u0633\u062a\u062e\u062f\u0645 \u0628\u0627\u0633\u0645 %s brainfuckCycleLimit=\u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062c \u062a\u062c\u0627\u0648\u0632 \u062f\u0648\u0631\u0629 \u0643\u062d\u062f \u0623\u0642\u0635\u0649 \u0627\u0644\u0639\u062f\u062f \u0645\u0646 {0} brainfuckDataPointerOutOfBounds=\u0645\u0624\u0634\u0631 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u062e\u0627\u0631\u062c \u0627\u0644\u062d\u062f\u0648\u062f\: {0} @@ -211,6 +212,7 @@ commandsModeration=\u0627\u0644\u0627\u0634\u0631\u0627\u0641 commandsMaintenance=\u0627\u0644\u0635\u064a\u0627\u0646\u0629 commandsBotOwner=\u0645\u0627\u0644\u0643 \u0628\u0648\u062a commandsMoreHelp=\u0648\u064a\u0642\u0648\u0644 {0} \u0644\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u062d\u0648\u0644 \u0623\u0645\u0631 \u0645\u0639\u064a\u0646. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=\u0623\u0645\u0631 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641. helpDocsLocation=\u064a\u0645\u0643\u0646 \u0627\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u0649 \u0627\u0644\u0648\u062b\u0627\u0626\u0642 \u0641\u064a\: helpBotInvite=\u0647\u0644 \u062a\u0631\u064a\u062f \u0625\u0636\u0627\u0641\u0629 \u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a \u0625\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643\u061f \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062f\u064a\u0643 \u0623\u0630\u0648\u0646\u0627\u062a "\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0645\u0644\u0642\u0645" \u0644\u0644\u0646\u0642\u0627\u0628\u0629 \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643\u060c \u064a\u0645\u0643\u0646\u0643 \u062f\u0639\u0648\u0629 \u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a\: @@ -222,6 +224,7 @@ helpProperUsage=\u0627\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0 helpCommandOwnerRestricted=\u064a\u0642\u062a\u0635\u0631 \u0647\u0630\u0627 \u0627\u0644\u0623\u0645\u0631 \u0639\u0644\u0649 \u0645\u0627\u0644\u0643 \u0627\u0644\u0628\u0648\u062a. helpConfigCommand=\u0648\u062a\u0628\u064a\u0646 \u0627\u0644\u062a\u0647\u064a\u0626\u0629 \u0644\u0647\u0630\u0647 \u0627\u0644\u0646\u0642\u0627\u0628\u0629 \u0623\u0648 \u0636\u0628\u0637 \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a. helpLanguageCommand=\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0644\u063a\u0627\u062a \u0627\u0644\u0645\u062a\u0648\u0641\u0631\u0629 \u0623\u0648 \u062a\u0639\u064a\u064a\u0646 \u0644\u063a\u0629 \u0644\u0647\u0630\u0647 \u0627\u0644\u0646\u0642\u0627\u0628\u0629. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=\u062d\u0638\u0631 \u0645\u0633\u062a\u062e\u062f\u0645 \u0648\u062d\u0630\u0641 \u0631\u0633\u0627\u0626\u0644\u0647 \u0645\u0646 \u0622\u062e\u0631 7 \u0623\u064a\u0627\u0645. helpKickCommand=\u062a\u0631\u062f \u0645\u0633\u062a\u062e\u062f\u0645 \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0646\u0642\u0627\u0628\u0629. helpSoftbanCommand=\u0633\u0648\u0641\u062a\u0628\u0627\u0646 \u0645\u0633\u062a\u062e\u062f\u0645 \u0628\u062a\u0631\u062f\u0647 \u0644\u0647 \u0648\u062d\u0630\u0641 \u0631\u0633\u0627\u0626\u0644\u0647 \u0645\u0646 \u0622\u062e\u0631 7 \u0623\u064a\u0627\u0645. @@ -302,4 +305,20 @@ mathOperationInfinity=\u0627\u0644\u0631\u0642\u0645 \u0643\u0628\u064a\u0631 \u prefix=\u0627\u0644\u0628\u0627\u062f\u0626\u0629 prefixGuild=\u0627\u0644\u0628\u0627\u062f\u0626\u0629 \u0644\u0647\u0630\u0647 \u0627\u0644\u0646\u0642\u0627\u0628\u0629 \u0647\u064a {0} prefixShowAgain=\u064a\u0645\u0643\u0646\u0643 \u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0628\u0627\u062f\u0626\u0629 \u0641\u064a \u0623\u064a \u0648\u0642\u062a \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 \u0645\u0646 \u062e\u0644\u0627\u0644 \u0630\u0643\u0631 \u0644\u064a. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a +moduleMusic=\u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0649 +moduleModeration=\u0627\u0644\u0625\u0634\u0631\u0627\u0641 +moduleUtility=\u0627\u0644\u0623\u062f\u0648\u0627\u062a +moduleFun=\u0645\u062a\u0639\u0629 +moduleLocked=\u0627\u0644\u0648\u062d\u062f\u0629 \u0627\u0644\u0646\u0645\u0637\u064a\u0629 {0} \u0645\u0624\u0645\u0646 \u0648\u0644\u0627 \u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0627\u0644\u062a\u0645\u0643\u064a\u0646/\u0627\u0644\u062a\u0639\u0637\u064a\u0644. +moduleCantParse=\u0644\u0627 \u064a\u0648\u062c\u062f \u0645\u062b\u0644 \u0647\u0630\u0647 \u0627\u0644\u0648\u062d\u062f\u0629 \u0627\u0644\u0646\u0645\u0637\u064a\u0629. \u0625\u0638\u0647\u0627\u0631 \u0642\u0627\u0626\u0645\u0629 \u0628\u0627\u0644\u0648\u062d\u062f\u0627\u062a \u0627\u0644\u0645\u062a\u0627\u062d\u0629 \u0645\u0639 {0} +moduleStatus=\u062d\u0627\u0644\u0629 \u0627\u0644\u0648\u062d\u062f\u0629 \u0627\u0644\u0646\u0645\u0637\u064a\u0629 +moduleDisable=\u062a\u0639\u0637\u064a\u0644 \u0648\u062d\u062f\u0627\u062a +moduleEnable=\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u0623\u0646\u0645\u0627\u0637. +moduleShowCommands=\u0648\u064a\u0642\u0648\u0644 {0} \u0644\u0645\u0634\u0627\u0647\u062f\u0629 \u0627\u0644\u0623\u0648\u0627\u0645\u0631 \u0644\u0647\u0630\u0647 \u0627\u0644\u0648\u062d\u062f\u0629. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/bg_BG.properties b/FredBoat/src/main/resources/lang/bg_BG.properties index 33cd5e1df..3ea508f55 100644 --- a/FredBoat/src/main/resources/lang/bg_BG.properties +++ b/FredBoat/src/main/resources/lang/bg_BG.properties @@ -1,11 +1,11 @@ #X-Generator: crowdin.com playQueueEmpty=\u041f\u043b\u0435\u0430\u0440\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0435 \u0438\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430 \u043d\u0438\u0449\u043e. \u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 \u0441\u043b\u0435\u0434\u043d\u0430\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043f\u0435\u0441\u0435\u043d\:\n;;play -playAlreadyPlaying=\u041f\u043b\u0435\u044a\u0440\u0430 \u0432\u0435\u0447\u0435 \u0441\u0432\u0438\u0440\u0438. -playVCEmpty=\u041d\u044f\u043c\u0430 \u043d\u0438\u043a\u0430\u043a\u0432\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0432 \u0433\u043b\u0430\u0441\u043e\u0432\u0438\u044f \u043a\u0430\u043d\u0430\u043b. +playAlreadyPlaying=\u041f\u043b\u0435\u0439\u044a\u0440\u0430 \u0432\u0435\u0447\u0435 \u0441\u0432\u0438\u0440\u0438. +playVCEmpty=\u041d\u044f\u043c\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0432 \u0433\u043b\u0430\u0441\u043e\u0432\u0438\u044f \u043a\u0430\u043d\u0430\u043b. playWillNowPlay=\u041f\u043b\u0435\u044a\u0440\u0430 \u0441\u0435\u0433\u0430 \u0449\u0435 \u0437\u0430\u043f\u043e\u0447\u043d\u0435 \u0434\u0430 \u0441\u0432\u0438\u0440\u0438. playSearching=\u0422\u044a\u0440\u0441\u0435\u043d\u0435 \u0432 YouTube \u0437\u0430 `{q}`... playYoutubeSearchError=\u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430 \u0432 \u0442\u044a\u0440\u0441\u0435\u043d\u0435\u0442\u043e. \u041e\u0431\u043c\u0438\u0441\u043b\u0435\u0442\u0435 \u0434\u0430 \u0432\u044a\u0432\u0435\u0434\u0435\u0442\u0435 \u043b\u0438\u043d\u043a\u0430 \u043d\u0430 \u043f\u0435\u0441\u0435\u043d\u0442\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043d\u043e.\n```\n;;play ``` -playSearchNoResults=\u041d\u044f\u043c\u0430 \u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u0438 \u0437\u0430 `{q}` +playSearchNoResults=\u041d\u044f\u043c\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438 \u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u0438 \u0437\u0430 `{q}` playSelectVideo=**\u041c\u043e\u043b\u044f \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u043f\u0435\u0441\u0435\u043d \u0441 `{0};;play n` \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0442\u0430\:** joinJoining=\u0412\u043b\u0438\u0437\u0430\u043d\u0435 \u0432 {0} joinErrorAlreadyJoining=\u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430. \u041d\u0435 \u043c\u043e\u0436\u0435\u0445 \u0434\u0430 \u0432\u043b\u044f\u0437\u0430 \u0432 {0} \u0432\u0435\u0447\u0435 \u0441\u0435 \u043e\u043f\u0438\u0442\u0432\u0430\u043c \u0434\u0430 \u0432\u043b\u044f\u0437\u0430 \u0432 \u0442\u043e\u0437\u0438 \u043a\u0430\u043d\u0430\u043b. \u041c\u043e\u043b\u044f \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e. @@ -15,11 +15,11 @@ repeatOnSingle=\u041f\u043b\u0435\u044a\u0440\u0430 \u0441\u0435\u0433\u0430 \u0 repeatOnAll=\u041f\u043b\u0435\u044a\u0440\u0430 \u0441\u0435\u0433\u0430 \u0449\u0435 \u043f\u043e\u0432\u0442\u0430\u0440\u044f \u043e\u043f\u0430\u0448\u043a\u0430\u0442\u0430. repeatOff=\u041f\u043b\u0435\u044a\u0440\u0430 \u0432\u0435\u0447\u0435 \u043d\u0435 \u0435 \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u043e\u0432\u0442\u0430\u0440\u044f\u043d\u0435. selectSuccess=\u041f\u0435\u0441\u0435\u043d\u0442\u0430 **\#{0}** \u0431\u0435\u0448\u0435 \u0438\u0437\u0431\u0440\u0430\u043d\u0430\: **{1}** ({2}) -selectInterval=\u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u043e\u043c\u0435\u0440 \u043e\u0442 1-{0}. +selectInterval=\u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u043e\u043c\u0435\u0440 \u043e\u0442 1 \u0434\u043e {0}. selectSelectionNotGiven=\u0422\u0440\u044f\u0431\u0432\u0430 \u043f\u044a\u0440\u0432\u043e \u0434\u0430 \u0431\u044a\u0434\u0435\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0435\u043d \u0441 \u0438\u0437\u0431\u043e\u0440 \u043e\u0442 \u043a\u043e\u0438\u0442\u043e \u0434\u0430 \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435. -shuffleOn=\u041f\u043b\u0435\u044a\u0440\u0430 \u0432\u0435\u0447\u0435 \u0435 \u0440\u0430\u0437\u0431\u044a\u0440\u043a\u0430\u043d. -shuffleOff=\u041f\u043b\u0435\u044a\u0440\u0430 \u0432\u0435\u0447\u0435 \u043d\u0435 \u0435 \u0440\u0430\u0437\u0431\u044a\u0440\u043a\u0430\u043d. -reshufflePlaylist=\u041e\u043f\u0430\u0448\u043a\u0430\u0442\u0430 \u0435 \u0440\u0430\u0437\u0431\u044a\u0440\u043a\u0430\u043d\u0430 \u043e\u0442\u043d\u043e\u0432\u043e. +shuffleOn=\u041f\u043b\u0435\u0439\u044a\u0440\u0430 \u0432\u0435\u0447\u0435 \u0435 \u0440\u0430\u0437\u0431\u044a\u0440\u043a\u0430\u043d. +shuffleOff=\u041f\u043b\u0435\u0439\u044a\u0440\u0430 \u0432\u0435\u0447\u0435 \u043d\u0435 \u0435 \u0440\u0430\u0437\u0431\u044a\u0440\u043a\u0430\u043d. +reshufflePlaylist=\u041e\u043f\u0430\u0448\u043a\u0430\u0442\u0430 \u0440\u0430\u0437\u0431\u044a\u0440\u043a\u0430\u043d\u0430. reshufflePlayerNotShuffling=\u0422\u0440\u044f\u0431\u0432\u0430 \u043f\u044a\u0440\u0432\u043e \u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0437\u0431\u044a\u0440\u043a\u0432\u0430\u043d\u0435. skipEmpty=\u041e\u043f\u0430\u0448\u043a\u0430\u0442\u0430 \u0435 \u043f\u0440\u0430\u0437\u043d\u0430\! skipOutOfBounds=\u041d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u043f\u0440\u0435\u043c\u0430\u0445\u043d\u0435\u0442\u0435 \u043f\u0435\u0441\u0435\u043d \u043d\u043e\u043c\u0435\u0440 {0} \u043a\u043e\u0433\u0430\u0442\u043e \u0438\u043c\u0430 \u0441\u0430\u043c\u043e {1} \u043f\u0435\u0441\u043d\u0438. @@ -33,10 +33,10 @@ stopEmptyOne=\u041e\u043f\u0430\u0448\u043a\u0430\u0442\u0430 \u0431\u0435\u0448 stopEmptySeveral=\u041e\u043f\u0430\u0448\u043a\u0430\u0442\u0430 \u0431\u0435\u0448\u0435 \u0438\u0437\u043f\u0440\u0430\u0437\u043d\u0435\u043d\u0430, `{0}`\u043f\u0435\u0441\u043d\u0438 \u0431\u044f\u0445\u0430 \u043f\u0440\u0435\u043c\u0430\u0445\u043d\u0430\u0442\u0438. stopAccessDenied=\u0417\u0430 \u0434\u0430 \u0441\u0435 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u0430, \u0442\u0430\u0437\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0435 \u0434\u043e\u0441\u0442\u044a\u043f\u043d\u0430 \u0441\u0430\u043c\u043e \u0437\u0430 \u0442\u0435\u0437\u0438, \u043a\u043e\u0438\u0442\u043e \u043c\u043e\u0433\u0430\u0442 \u0434\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0432\u0430\u0442 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f. unpauseQueueEmpty=\u041e\u043f\u0430\u0448\u043a\u0430\u0442\u0430 \u0435 \u043f\u0440\u0430\u0437\u043d\u0430. -unpausePlayerNotPaused=\u041f\u043b\u0435\u044a\u0440\u0430 \u043d\u0435 \u0435 \u0432 \u043f\u0430\u0443\u0437\u0430. +unpausePlayerNotPaused=\u041f\u043b\u0435\u0439\u044a\u0440\u0430 \u043d\u0435 \u0435 \u043f\u0430\u0443\u0437\u0438\u0440\u0430\u043d. unpauseNoUsers=\u041d\u044f\u043c\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0432 \u0433\u043b\u0430\u0441\u043e\u0432\u0438\u044f \u043a\u0430\u043d\u0430\u043b. -unpauseSuccess=\u041f\u043b\u0435\u044a\u0440\u0430 \u0432\u0435\u0447\u0435 \u043d\u0435 \u0435 \u0432 \u043f\u0430\u0443\u0437\u0430. -volumeApology=\u0421\u044a\u0436\u0430\u043b\u044f\u0432\u0430\u043c\u0435\! ;;volume \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0442\u0430 \u0435 \u043e\u0442\u0445\u0432\u044a\u0440\u043b\u0435\u043d\u0430 \u043e\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0438\u044f \u043c\u0443\u0437\u0438\u043a\u0430\u043b\u0435\u043d \u0440\u043e\u0431\u043e\u0442. \u0422\u043e\u0432\u0430 \u0435 \u0437\u0430\u0449\u043e\u0442\u043e \u0442\u0430\u043a\u0430 \u0440\u043e\u0431\u043e\u0442\u044a\u0442 \u043f\u0440\u0435\u043a\u0430\u0440\u0432\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u0432\u0440\u0435\u043c\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0432\u0430\u0439\u043a\u0438 \u0430\u0443\u0434\u0438\u043e\u0442\u043e, \u043d\u044f\u043a\u043e\u0439 \u043f\u0435\u0441\u043d\u0438 \u0434\u043e 5 \u043f\u044a\u0442\u0438 \u043f\u043e\u0432\u0435\u0447\u0435, \u0442\u043e\u0432\u0430 \u043a\u0430\u0440\u0430 \u0432\u0441\u0438\u0447\u043a\u0438 \u0434\u0430 \u0447\u0443\u0432\u0430\u0442 \u0437\u0430\u0435\u043a\u0432\u0430\u043d\u0435. \u041f\u0440\u0435\u043c\u0430\u0445\u0432\u0430\u0439\u043a\u0438 \u0442\u0430\u0437\u0438 \u043e\u043f\u0446\u0438\u044f FredBoat \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0432\u0438\u0440\u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0447\u0435 \u043c\u0443\u0437\u0438\u043a\u0430 \u0431\u0435\u0437 \u0434\u0430 \u0437\u0430\u0435\u043a\u0432\u0430.\n\u041f\u0440\u0435\u043f\u043e\u0440\u044a\u0447\u0432\u0430\u043c \u0434\u0430 \u043d\u0430\u043c\u0430\u043b\u044f\u0432\u0430\u0442\u0435 \u0437\u0432\u0443\u043a\u0430 \u043d\u0430 \u0440\u043e\u0431\u043e\u0442\u0430 \u043f\u0440\u0435\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u0442\u0435 \u043d\u0430 Discord https\://fred.moe/1vD.png +unpauseSuccess=\u041f\u043b\u0435\u0439\u044a\u0440\u0430 \u0432\u0435\u0447\u0435 \u043d\u0435 \u0435 \u043f\u0430\u0443\u0437\u0438\u0440\u0430\u043d. +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 `;;volume <0-150>`. {0}% \u0435 \u043f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435.\n\u0412 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0435 \u043d\u0430 **{1}%**. volumeSuccess=\u0417\u0432\u0443\u043a\u0430 \u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0435\u043d \u043e\u0442 **{0}%** \u043d\u0430 **{1}%**. exportEmpty=\u041d\u044f\u043c\u0430 \u043d\u0438\u0449\u043e \u0437\u0430 \u0438\u0437\u043d\u0430\u0441\u044f\u043d\u0435, \u043e\u043f\u0430\u0448\u043a\u0430\u0442\u0430 \u0435 \u043f\u0440\u0430\u0437\u043d\u0430. @@ -45,8 +45,8 @@ exportPlaylistFail=\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043a listShowShuffled=\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0435\u043d\u0430\u0442\u0430 \u043e\u043f\u0430\u0448\u043a\u0430. listShowRepeatSingle=\u041f\u043e\u0432\u0442\u0430\u0440\u044f\u043d\u0435 \u043d\u0430 \u043f\u0435\u0441\u0435\u043d\u0442\u0430. listShowRepeatAll=\u041f\u043e\u0432\u0442\u0430\u0440\u044f\u043d\u0435 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u0442\u0430 \u043e\u043f\u0430\u0448\u043a\u0430. -listShowHistory=Showing tracks in history. -listAddedBy=**{0}** added by **{1}** `[{2}]` +listShowHistory=\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u0435\u0441\u043d\u0438 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u0442\u0430. +listAddedBy=**{0} ** \u0434\u043e\u0431\u0430\u0432\u0435\u043d \u043e\u0442 **{1} ** `[{2}]` listStreamsOnlySingle=\u0418\u043c\u0430 **{0} ** \u0436\u0438\u0432\u043e {1} \u0432 \u043e\u043f\u0430\u0448\u043a\u0430\u0442\u0430. listStreamsOnlyMultiple=\u0418\u043c\u0430 **{0} ** \u0436\u0438\u0432\u043e {1} \u0432 \u043e\u043f\u0430\u0448\u043a\u0430\u0442\u0430. listStreamsOrTracksSingle=\u0418\u043c\u0430 **{0} ** {1} \u0441 \u043e\u0441\u0442\u0430\u043d\u0430\u043b\u0430\u0442\u0430 \u0434\u044a\u043b\u0436\u0438\u043d\u0430 \u043e\u0442 ** [{2}] **{3} \u0432 \u043e\u043f\u0430\u0448\u043a\u0430\u0442\u0430. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=, \u043a\u0430\u043a\u0442\u043e \u0438 **{0} ** \u0436\ trackSingular=\u043f\u0435\u0441\u0435\u043d trackPlural=\u043f\u0435\u0441\u0435\u043d\u0438 npNotPlaying=\u0412 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0435 \u0441\u0432\u0438\u0440\u0438 \u043d\u0438\u0449\u043e. -npNotInHistory=Currently no tracks in history. +npNotInHistory=\u0412 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u044f\u043c\u0430 \u043f\u0435\u0441\u043d\u0438 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u0442\u0430. npDescription=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 npLoadedSoundcloud=[{0}/{1}] \u0417\u0430\u0440\u0435\u0434\u0435\u043d\u043e \u043e\u0442 Soundcloud npLoadedBandcamp={0}, \u0437\u0430\u0440\u0435\u0434\u0435\u043d\u043e \u043e\u0442 Bandcamp @@ -125,22 +125,23 @@ luaError=\ \u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u0433\u0440\u0435\u luaErrorOutputTooBig=\ \u0418\u0437\u0445\u043e\u0434\u043d\u0438\u044f\u0442 \u0431\u0443\u0444\u0435\u0440 \u0435 \u043f\u0440\u0435\u043a\u0430\u043b\u0435\u043d\u043e \u0433\u043e\u043b\u044f\u043c \:anger\: Discord \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0432\u0430 \u0441\u0430\u043c\u043e 2000 \u0437\u043d\u0430\u043a\u0430 \u043d\u0430 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0438\u043c\u0430\u043c {0} luaTimeout=\ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0437\u0442\u0435\u0447\u0435 \:anger\: , \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0432\u0430 \u0438\u0437\u0447\u0438\u0441\u043b\u044f\u0432\u0430\u043d\u0435 \u0432\u0440\u0435\u043c\u0435\u0442\u043e \u0435 {0} \u0441\u0435\u043a\u0443\u043d\u0434\u0438. helpSuccess={0}\: \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0435 \u0438\u0437\u043f\u0440\u0430\u0442\u0435\u043d\u0430 \u0434\u043e \u0432\u0430\u0448\u0438\u0442\u0435 \u043b\u0438\u0447\u043d\u0438 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f\! -helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! +helpDmFailed=\u041d\u0435 \u043c\u043e\u0436\u0430\u0445 \u0434\u0430 \u0438\u0437\u043f\u0440\u0430\u0442\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 \u0412\u0430\u0448\u0438\u0442\u0435 \u043b\u0438\u0447\u043d\u0438 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041c\u043e\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u0442\u0435, \u0434\u0430\u043b\u0438 \u043d\u0435 \u0441\u0430 \u0437\u0430\u0431\u0440\u0430\u043d\u0435\u043d\u0438\! helpCommandsPromotion=\u041a\u0430\u0436\u0438 {0} \u0434\u0430 \u043d\u0430\u0443\u0447\u0438\u0442\u0435 \u043a\u0430\u043a\u0432\u043e \u043c\u043e\u0436\u0435 \u0434\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0438 \u0442\u043e\u0437\u0438 \u0431\u043e\u0442\! +musicCommandsPromotion=\u041a\u0430\u0436\u0435\u0442\u0435 {0} \u0437\u0430 \u0434\u0430 \u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u044a\u043b\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u044a\u043a \u043e\u0442 \u043c\u0443\u0437\u0438\u043a\u0430\u043b\u043d\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0438. fuzzyNoResults=\u041d\u044f\u043c\u0430 \u0442\u0430\u043a\u0438\u0432\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 brainfuckCycleLimit=\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u0430 \u043d\u0430\u0434\u0432\u0438\u0448\u0430\u0432\u0430\u0442 \u0431\u0440\u043e\u044f \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043d\u043e \u0446\u0438\u043a\u044a\u043b \u043d\u0430 {0} brainfuckDataPointerOutOfBounds=\u0414\u0430\u043d\u043d\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0435\u0446\u0430 \u043e\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0438\u0442\u0435\: {0} brainfuckInputOOB=\u0412\u0445\u043e\u0434 \u0438\u0437\u0432\u044a\u043d \u0433\u0440\u0430\u043d\u0438\u0446\u0438\u0442\u0435 \u043d\u0430 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\: {0} brainfuckNoOutput=\ \u041d\u044f\u043c\u0430\u0448\u0435 \u043d\u0438\u043a\u0430\u043a\u0432\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0446\u0438\u044f -weatherLocationNotFound=Unable to find location, please check your input {0}. -weatherError=Error retrieving weather for {0} +weatherLocationNotFound=\u041b\u043e\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0430, \u043c\u043e\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u0442\u0435 \u0412\u0430\u0448\u0435\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 {0}. +weatherError=\u0413\u0440\u0435\u0448\u043a\u0430 \u043f\u0440\u0438 \u0438\u0437\u0432\u043b\u0438\u0447\u0430\u043d\u0435 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u0442\u043e \u0437\u0430 {0} avatarSuccess=\ \u043d\u0430\u043c\u0435\u0440\u0438\u0445 \u0433\u043e\n{0} configNoArgs=\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0437\u0430 **{0} **\:'''' '' configSetTo=\u0441\u0435\u0433\u0430 \u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 "{0}". configUnknownKey={0}\: \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u043b\u044e\u0447. configMustBeBoolean={0}\: \u0441\u0442\u043e\u0439\u043d\u043e\u0441\u0442\u0442\u0430 \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 true \u0438\u043b\u0438 false. -modReason=Reason -modAuditLogMessage=Action issued by {0}\#{1} [{2}] +modReason=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 +modAuditLogMessage=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0438\u0437\u0434\u0430\u0434\u0435\u043d\u043e \u043e\u0442 {0}\#{1} [{2}] modFailUserHierarchy=\u0412\u0438\u0435 \u043d\u044f\u043c\u0430\u0442\u0435 \u043f\u043e \u0432\u0438\u0441\u043e\u043a\u0430 \u0440\u043e\u043b\u044f \u043e\u0442 {0}. modFailBotHierarchy=\u0422\u0440\u044f\u0431\u0432\u0430 \u043c\u0438 \u043f\u043e \u0432\u0438\u0441\u043e\u043a\u0430 \u0440\u043e\u043b\u044f \u043e\u0442 {0}. modBanFail=\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0431\u0430\u043d\u0432\u0430\u043d\u0435 \u043d\u0430 {0} @@ -183,7 +184,7 @@ ratelimitedGeneralInfo=\u0412\u0438\u0435 \u0441\u0442\u0435 \u043e\u0433\u0440\ ratelimitedSkipCommand=\u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043d\u0435\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435 \u043e\u0442 \u0435\u0434\u043d\u0430 \u043f\u0435\u0441\u0435\u043d \u0441 \u0442\u0430\u0437\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\: {0} ratelimitedGuildSlowLoadingPlaylist=\u0422\u043e\u0437\u0438 \u0441\u044a\u0440\u0432\u044a\u0440 \u043d\u0435 \u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u044f \u043f\u043e\u0432\u0435\u0447\u0435 playlists \u0432 \u0442\u043e\u0437\u0438 \u043c\u043e\u043c\u0435\u043d\u0442. \u041c\u043e\u043b\u044f \u043d\u0435 \u0441\u043f\u0430\u043c\u0435\u0442\u0435 \u0434\u044a\u043b\u0433\u0438 playlists. unblacklisted=\u041f\u0440\u0435\u043c\u0430\u0445\u043d\u0430\u0442 {0} \u043e\u0442 \u0447\u0435\u0440\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u044a\u043a. -serverinfoTitle=Info about {0}\: +serverinfoTitle=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 {0}\: serverinfoOnlineUsers=\u041e\u043d\u043b\u0430\u0439\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438\: serverinfoTotalUsers=\u041e\u0431\u0449\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438\: serverinfoRoles=\u0420\u043e\u043b\u0438\: @@ -193,17 +194,17 @@ serverinfoGuildID=\u0413\u0438\u043b\u0434\u0438\u044f\u0442\u0430 \u0418\u0414\ serverinfoCreationDate=\u0414\u0430\u0442\u0430 \u043d\u0430 \u0441\u044a\u0437\u0434\u0430\u0432\u0430\u043d\u0435\: serverinfoOwner=\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u0438\u043a\: serverinfoVLv=\u041a\u043e\u0434 \u0437\u0430 \u043f\u043e\u0442\u0432\u044a\u0440\u0436\u0434\u0430\u0432\u0430\u043d\u0435\: -userinfoTitle=Information about {0}\: +userinfoTitle=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 {0}\: userinfoUsername=\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435\: userinfoId=ID\: userinfoNick=\u041f\u0440\u044f\u043a\u043e\u0440\: userinfoKnownServer=\u0418\u0437\u0432\u0435\u0441\u0442\u043d\u0438 \u0441\u044a\u0440\u0432\u044a\u0440\u0438\: userinfoJoinDate=\u0414\u0430\u0442\u0430 \u043d\u0430 \u043f\u0440\u0438\u0441\u044a\u0435\u0434\u0438\u043d\u044f\u0432\u0430\u043d\u0435\: userinfoCreationTime=\u0414\u0430\u0442\u0430 \u043d\u0430 \u0441\u044a\u0437\u0434\u0430\u0432\u0430\u043d\u0435\: -userinfoBlacklisted=Blacklisted\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +userinfoBlacklisted=\u0427\u0435\u0440\u0435\u043d \u0441\u043f\u0438\u0441\u044a\u043a\: +skipDeniedTooManyTracks=\u041d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u0435 \u043f\u0435\u0441\u043d\u0438 \u043d\u0430 \u043d\u044f\u043a\u043e\u0439 \u0434\u0440\u0443\u0433, \u0430\u043a\u043e \u043d\u0435 \u0441\u0442\u0435 DJ. \u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0442\u0430 Voteskip. eventUsersLeftVC=\u0412\u0441\u0438\u0447\u043a\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0441\u0430 \u043d\u0430\u043f\u0443\u0441\u043d\u0430\u043b\u0438 \u0433\u043b\u0430\u0441\u043e\u0432\u0438\u044f \u043a\u0430\u043d\u0430\u043b. \u041f\u043b\u0435\u0430\u0440\u0430 \u0435 \u0432 \u043f\u0430\u0443\u0437\u0430. -eventAutoResumed=User presence detected, automatically resuming the player. +eventAutoResumed=\u041e\u0442\u043a\u0440\u0438\u0442\u043e \u043f\u0440\u0438\u0441\u044a\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u0432\u044a\u0437\u043e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u043b\u0435\u0439\u044a\u0440\u0430. commandsFun=\u0417\u0430\u0431\u0430\u0432\u043d\u043e commandsMemes=Memes commandsUtility=\u041f\u043e\u043b\u0435\u0437\u043d\u043e @@ -211,17 +212,19 @@ commandsModeration=M\u043e\u0434\u0435\u0440\u0438\u0440\u0430\u043d\u0435 commandsMaintenance=\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430 \u043f\u043e\u0434\u0434\u0440\u044a\u0436\u043a\u0430 commandsBotOwner=\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u0438\u043a \u043d\u0430 \u0431\u043e\u0442\u0430 commandsMoreHelp=\u041a\u0430\u0436\u0430 {0} \u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430. -helpUnknownCommand=Unknown command. -helpDocsLocation=Documentation can be found at\: -helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: -helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! -helpNoDmCommands=You cannot send FredBoat commands through DMs. -helpCredits=Created by Fre_d and open source contributors +commandsModulesHint=\u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u0442\u0435 \u0438 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u0442\u0435 \u0434\u043e\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441 {0} +helpUnknownCommand=\u041d\u0435\u043f\u043e\u0437\u043d\u0430\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430. +helpDocsLocation=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0430\u043d\u0430 \u043d\u0430\: +helpBotInvite=\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 FredBoat \u043a\u044a\u043c \u0432\u0430\u0448\u0438\u044f \u0441\u044a\u0440\u0432\u044a\u0440? \u0410\u043a\u043e \u0438\u043c\u0430\u0442\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440, \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u043f\u043e\u043a\u0430\u043d\u0438\u0442\u0435 FredBoat\: +helpHangoutInvite=\u041d\u0443\u0436\u0434\u0430 \u043e\u0442 \u043f\u043e\u043c\u043e\u0449 \u0438\u043b\u0438 \u0438\u043c\u0430\u0442\u0435 \u043d\u044f\u043a\u0430\u043a\u0432\u0438 \u0438\u0434\u0435\u0438 \u0437\u0430 FredBoat? \u041c\u043e\u0436\u0435 \u0431\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u0441\u0435 \u043c\u043e\u0442\u0430\u0435\u0442\u0435? \u041f\u0440\u0438\u0441\u044a\u0435\u0434\u0438\u043d\u0435\u0442\u0435 \u0441\u0435 \u043a\u044a\u043c \u043e\u0431\u0449\u043d\u043e\u0441\u0442\u0442\u0430 \u043d\u0430 FredBoat\! +helpNoDmCommands=\u041d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u0438\u0437\u043f\u0440\u0430\u0449\u0430\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0438 \u043d\u0430 FredBoat \u0447\u0440\u0435\u0437 \u041b\u0438\u0447\u043d\u0438 \u0421\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f. +helpCredits=\u0421\u044a\u0437\u0434\u0430\u0434\u0435\u043d \u043e\u0442 Fre_d \u0438 open source \u0441\u044a\u0442\u0440\u0443\u0434\u043d\u0438\u0446\u0438 helpSent={0}\: \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0435 \u0438\u0437\u043f\u0440\u0430\u0442\u0435\u043d\u0430 \u0434\u043e \u0432\u0430\u0448\u0438\u0442\u0435 \u043b\u0438\u0447\u043d\u0438 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f\! helpProperUsage=\u041f\u0440\u0430\u0432\u0438\u043b\u043d\u043e\u0442\u043e \u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435\: helpCommandOwnerRestricted=\u0422\u0430\u0437\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0430\u0432\u0430 \u0434\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u0438\u043a\u0430 \u043d\u0430 \u0431\u043e\u0442\u0430. helpConfigCommand=\u041f\u043e\u043a\u0430\u0436\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 \u0442\u0430\u0437\u0438 \u0433\u0438\u043b\u0434\u0438\u044f \u0438\u043b\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u0442\u0435. helpLanguageCommand=\u041f\u043e\u043a\u0430\u0436\u0438 \u043d\u0430\u043b\u0438\u0447\u043d\u0438\u0442\u0435 \u0435\u0437\u0438\u0446\u0438 \u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u0435\u0437\u0438\u043a \u0437\u0430 \u0442\u0430\u0437\u0438 \u0433\u0438\u043b\u0434\u0438\u044f. +helpModules=\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430 \u043f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435, \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0432\u0430\u043d\u0435 \u0438\u043b\u0438 \u0437\u0430\u0431\u0440\u0430\u043d\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 \u0437\u0430 \u0442\u043e\u0437\u0438 \u0441\u044a\u0440\u0432\u044a\u0440. helpHardbanCommand=Ban \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b \u0438 \u0438\u0437\u0442\u0440\u0438\u0439\u0442\u0435 \u043d\u0435\u0433\u043e\u0432\u0438\u0442\u0435 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0442\u0435 7 \u0434\u043d\u0438. helpKickCommand=\u0418\u0437\u0433\u043e\u043d\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b \u043e\u0442 \u0442\u0430\u0437\u0438 \u0433\u0438\u043b\u0434\u0438\u044f. helpSoftbanCommand=Softban \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b \u043a\u0430\u0442\u043e \u0433\u043e \u043a\u0438\u043a\u043d\u0435\u0442\u0435 \u0438 \u0438\u0437\u0442\u0440\u0438\u0435\u0442\u0435 \u043d\u0435\u0433\u043e\u0432\u0438\u0442\u0435 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0442\u0435 7 \u0434\u043d\u0438. @@ -229,7 +232,7 @@ helpMusicCommandsHeader=FredBoat \u043c\u0443\u0437\u0438\u043a\u0430\u043b\u043 helpJoinCommand=\u041d\u0430\u043a\u0430\u0440\u0430\u0439\u0442\u0435 \u0431\u043e\u0442\u0430 \u0434\u0430 \u0432\u043b\u0435\u0437\u0435 \u0432 \u0441\u0435\u0433\u0430\u0448\u043d\u0438\u044f \u0433\u043b\u0430\u0441\u043e\u0432 \u043a\u0430\u043d\u0430\u043b. helpLeaveCommand=\u041d\u0430\u043a\u0430\u0440\u0430\u0439\u0442\u0435 \u0431\u043e\u0442\u0430 \u0434\u0430 \u043d\u0430\u043f\u0443\u0441\u043d\u0435 \u0441\u0435\u0433\u0430\u0448\u043d\u0438\u044f \u0433\u043b\u0430\u0441\u043e\u0432 \u043a\u0430\u043d\u0430\u043b. helpPauseCommand=\u041f\u0430\u0443\u0437\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043f\u043b\u0435\u044a\u0440\u0430. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=\u041f\u0443\u0441\u043d\u0435\u0442\u0435 \u043c\u0443\u0437\u0438\u043a\u0430 \u043e\u0442 \u0434\u0430\u0434\u0435\u043d\u0438\u044f URL \u0438\u043b\u0438 \u043f\u043e\u0442\u044a\u0440\u0441\u0435\u0442\u0435 \u043f\u0435\u0441\u0435\u043d. \u0417\u0430 \u043f\u044a\u043b\u0435\u043d \u0441\u043f\u0438\u0441\u044a\u043a \u043d\u0430 \u0438\u0437\u0442\u043e\u0447\u043d\u0438\u0446\u0438, \u043c\u043e\u043b\u044f \u043f\u043e\u0441\u0435\u0442\u0435\u0442\u0435 {0} helpPlaySplitCommand=\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u0442\u0435 YouTube \u0432\u0438\u0434\u0435\u043e \u0432 \u0442\u0440\u0430\u043a\u043b\u0438\u0441\u0442 \u0434\u0430\u0434\u0435\u043d \u0432 \u043d\u0435\u0433\u043e\u0432\u043e\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435. helpRepeatCommand=\u041f\u0440\u0435\u0432\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0436\u0438\u043c\u0438 \u043d\u0430 \u043f\u043e\u0432\u0442\u0430\u0440\u044f\u043d\u0435. helpReshuffleCommand=\u041f\u0440\u0435\u0443\u0441\u0442\u0440\u043e\u0439\u0432\u0430\u043d\u0435 \u043d\u0430 \u0441\u0435\u0433\u0430\u0448\u043d\u0430\u0442\u0430 \u043e\u043f\u0430\u0448\u043a\u0430\u0442\u0430. @@ -242,7 +245,7 @@ helpVolumeCommand=\u041f\u0440\u043e\u043c\u0435\u043d\u044f \u0441\u0438\u043b\ helpExportCommand=\u0415\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u0442\u0430 \u043e\u043f\u0430\u0448\u043a\u0430\u0442\u0430 \u043d\u0430 hastebin \u043b\u0438\u043d\u043a, \u043a\u043e\u0438\u0442\u043e \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430 \u043f\u043e-\u043a\u044a\u0441\u043d\u043e \u043a\u0430\u0442\u043e \u043f\u043b\u0430\u0439\u043b\u0438\u0441\u0442. helpGensokyoRadioCommand=\u041f\u043e\u043a\u0430\u0436\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u0442\u0430 \u043f\u0435\u0441\u0435\u043d \u043d\u0430 gensokyoradio.net helpListCommand=\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u043b\u0438\u0441\u0442 \u043e\u0442 \u043f\u0435\u0441\u043d\u0438 \u0432 \u0441\u0435\u0433\u0430\u0448\u043d\u0438\u044f \u043f\u043b\u0430\u0439\u043b\u0438\u0441\u0442. -helpHistoryCommand=Display a list of the songs in playlist history. +helpHistoryCommand=\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0441\u043f\u0438\u0441\u044a\u043a \u0441 \u043f\u0435\u0441\u043d\u0438\u0442\u0435 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u0442\u0430 \u043d\u0430 \u043f\u043b\u0435\u0439\u043b\u0438\u0441\u0442\u0430. helpNowplayingCommand=\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u0435\u0441\u0435\u043d\u0442\u0430 \u043a\u043e\u044f\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0441\u0432\u0438\u0440\u0438/\u0438\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430. helpForwardCommand=\u041f\u0440\u0435\u0432\u044a\u0440\u0442\u0430\u043d\u0438 \u043f\u0435\u0441\u0435\u043d\u0442\u0430 \u0434\u043e \u0434\u0430\u0434\u0435\u043d \u0443\u0447\u0430\u0441\u0442\u044a\u043a \u043e\u0442 \u0432\u0440\u0435\u043c\u0435. \u041f\u0440\u0438\u043c\u0435\u0440\: helpRestartCommand=\u0420\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0439\u0442\u0435 \u043f\u0435\u0441\u0435\u043d\u0442\u0430 \u043a\u043e\u044f\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0441\u0432\u0438\u0440\u0438/\u0438\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430. @@ -250,7 +253,7 @@ helpRewindCommand=\u0412\u044a\u0440\u043d\u0435\u0442\u0435 \u043f\u0435\u0441\ helpSeekCommand=\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 \u043f\u0435\u0441\u0435\u043d\u0442\u0430 \u0432 \u0434\u0430\u0434\u0435\u043d \u043c\u043e\u043c\u0435\u043d\u0442. \u041f\u0440\u0438\u043c\u0435\u0440\: helpAvatarCommand=\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0430\u0432\u0430\u0442\u0430\u0440\u0430 \u043d\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b. helpBrainfuckCommand=\u0418\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430 Brainfuck \u043a\u043e\u0434. \u041f\u0440\u0438\u043c\u0435\u0440\: -helpWeatherCommand=Display current weather by location. +helpWeatherCommand=\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u043e\u0442\u043e \u0432\u0440\u0435\u043c\u0435 \u043f\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. helpClearCommand=\u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u0432\u0441\u0438\u0447\u043a\u0438 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0442\u043e\u0437\u0438 \u0431\u043e\u0442 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0442\u0435 50 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0442\u043e\u0437\u0438 \u043a\u0430\u043d\u0430\u043b. helpCommandsCommand=\u041f\u043e\u043a\u0430\u0436\u0438 \u043d\u0430\u043b\u0438\u0447\u043d\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0438. helpHelpCommand=\u041f\u043e\u043b\u0443\u0447\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449 \u0437\u0430 \u0442\u043e\u0437\u0438 \u0431\u043e\u0442 \u0438\u043b\u0438 \u043f\u043e\u043c\u043e\u0449 \u0437\u0430 \u0432\u0441\u044f\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430. @@ -260,46 +263,62 @@ helpMusicHelpCommand=\u041f\u043e\u043a\u0430\u0436\u0438 \u043c\u0443\u0437\u04 helpSayCommand=\u041d\u0430\u043a\u0430\u0440\u0430\u0439\u0442\u0435 \u0431\u043e\u0442\u0430 \u0434\u0430 \u043a\u0430\u0436\u0435 \u043d\u0435\u0449\u043e. helpServerInfoCommand=\u041f\u043e\u043a\u0430\u0436\u0435\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0437\u0430 \u0442\u0430\u0437\u0438 \u0433\u0438\u043b\u0434\u0438\u044f/\u0441\u044a\u0440\u0432\u044a\u0440. helpUserInfoCommand=\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0441\u0435\u0431\u0435 \u0441\u0438 \u0438\u043b\u0438 \u0437\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b \u043f\u043e\u0437\u043d\u0430\u0442 \u043d\u0430 \u0431\u043e\u0442\u0430. -helpPerms=Allows whitelisting members and roles for the {0} rank. -helpPrefixCommand=Set the prefix for this guild. -helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. -helpMathOperationAdd=Print the sum of num1 and num2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. +helpPerms=\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0432\u0430 \u0438\u0437\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0437\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0438 \u0440\u043e\u043b\u0438 \u0441 \u0440\u0430\u043d\u043a {0}. +helpPrefixCommand=\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043a\u0430 \u0437\u0430 \u0442\u0430\u0437\u0438 \u0433\u0438\u043b\u0434\u0438\u044f. +helpVoteSkip=\u0413\u043b\u0430\u0441\u0443\u0432\u0430\u0439\u0442\u0435 \u0437\u0430 \u0434\u0430 \u043f\u0440\u0435\u0441\u043a\u043e\u0447\u0438\u0442\u0435 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u0442\u0430 \u043f\u0435\u0441\u0435\u043d. \u041d\u0443\u0436\u0435\u043d \u0435 \u0433\u043b\u0430\u0441\u044a\u0442 \u043d\u0430 50 % \u043e\u0442 \u0432\u0441\u0438\u0447\u043a\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0432 \u0433\u043b\u0430\u0441\u043e\u0432\u044f \u0447\u0430\u0442. +helpMathOperationAdd=\u041f\u0435\u0447\u0430\u0442 \u043d\u0430 \u0441\u0431\u043e\u0440\u0430 \u043e\u0442 num1 \u0438 num2. +helpMathOperationSub=\u041f\u0435\u0447\u0430\u0442 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u043a\u0430\u0442\u0430 \u043d\u0430 num2 - num1. +helpMathOperationMult=\u041f\u0435\u0447\u0430\u0442 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u0442\u043e \u043d\u0430 num1 * num2. +helpMathOperationDiv=\u041f\u0435\u0447\u0430\u0442 \u043d\u0430 \u0447\u0430\u0441\u0442\u043d\u043e\u0442\u043e \u043d\u0430 num1 / num2. +helpMathOperationMod=\u041f\u0435\u0447\u0430\u0442 \u043d\u0430 \u043e\u0441\u0442\u0430\u0442\u044a\u043a\u044a\u0442 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0442\u043e \u043d\u0430 num1 / num2. +helpMathOperationPerc=\u041f\u0435\u0447\u0430\u0442 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0432\u0430\u043d \u043e\u0442 num1 \u0432\u044a\u0440\u0445\u0443 num2. +helpMathOperationSqrt=\u041f\u0435\u0447\u0430\u0442 \u043d\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u0438\u044f \u043a\u043e\u0440\u0435\u043d \u043d\u0430 num. +helpMathOperationPow=\u041f\u0435\u0447\u0430\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u0430 \u043e\u0442 num1 ^ num2. destroyDenied=\u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0438\u043c\u0430\u0442\u0435 manage massages \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0443\u043b\u0438\u0440\u0430\u0442\u0435 \u043f\u043b\u0435\u044a\u0440\u0430. destroyHelp=\u041d\u0443\u043b\u0438\u0440\u0430\u0439\u0442\u0435 \u043f\u043b\u0435\u044a\u0440\u0430 \u0438 \u0438\u0437\u0447\u0438\u0441\u0442\u0435\u0442\u0435 \u043f\u043b\u0430\u0439\u043b\u0438\u0441\u0442\u0430. \u0420\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0430\u043d\u043e \u0437\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440\u0438 \u0441 Manage Messages \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u0442\u043e. destroySucc=\u0420\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0445 \u043f\u043b\u0435\u044a\u0440\u0430 \u0438 \u0438\u0437\u0447\u0438\u0441\u0442\u0438\u0445 \u043e\u043f\u0430\u0448\u043a\u0430\u0442\u0430. listPageNum=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 **{0} ** \u043e\u0442 **{1} **. -permsListTitle=Users and roles with the {0} permissions -permsAdded=Added `{0}` to `{1}`. -permsRemoved=Removed `{0}` from `{1}`. -permsFailSelfDemotion=You cannot remove this as it would render you without admin permissions\! -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} -fuzzyMultiple=Multiple items were found. Did you mean any of these? -fuzzyNothingFound=Nothing found for `{0}`. -cmdPermsTooLow=You don''t have permission to run this command\! This command requires `{0}` but you only have `{1}`. +permsListTitle=\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0438 \u0440\u043e\u043b\u0438 \u0441 {0} \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f +permsAdded=\u0414\u043e\u0431\u0430\u0432\u0435\u043d ''{0}'' \u0432 ''{1}''. +permsRemoved=\u041f\u0440\u0435\u043c\u0430\u0445\u043d\u0430\u0442 "{0}" \u043e\u0442 "{1}". +permsFailSelfDemotion=\u041d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u043f\u0440\u0435\u043c\u0430\u0445\u043d\u0435\u0442\u0435 \u0442\u043e\u0432\u0430, \u0442\u044a\u0439 \u043a\u0430\u0442\u043e \u0449\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0435 \u0431\u0435\u0437 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0441\u043a\u0438 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0438\! +permsAlreadyAdded={0} \u0435 \u0432\u0435\u0447\u0435 \u0434\u043e\u0431\u0430\u0432\u0435\u043d \u043a\u044a\u043c {1} +permsNotAdded={0} \u043d\u0435 \u0435 \u0432 {1} +fuzzyMultiple=\u041d\u0430\u043c\u0435\u0440\u0435\u043d\u0438 \u0441\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438. \u0414\u0430 \u043d\u0435 \u0431\u0438 \u0434\u0430 \u0438\u043c\u0430\u0442\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434 \u043d\u044f\u043a\u043e\u0439 \u043e\u0442 \u0442\u0435\u0437\u0438? +fuzzyNothingFound=\u041d\u0435 \u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043e \u043d\u0438\u0449\u043e \u0437\u0430 `{0}`. +cmdPermsTooLow=\u041d\u044f\u043c\u0430\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u044a\u0447\u043d\u043e \u043f\u0440\u0430\u0432\u0430 \u0437\u0430 \u0434\u0430 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 \u0442\u0430\u0437\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430. \u041a\u043e\u043c\u0430\u043d\u0434\u0430\u0442\u0430 \u0438\u0437\u0438\u0441\u043a\u0432\u0430 `{0}`, \u043d\u043e \u0432\u0438\u0435 \u0438\u043c\u0430\u0442\u0435 \u0441\u0430\u043c\u043e `{1}`. playersLimited=FredBoat is currently at maximum capacity\! The bot is currently fixed to only play up to `{0}` streams, otherwise we would risk disconnecting from Discord under the network load.\nIf you want to help us increase the limit or you want to use our non-overcrowded bot, please support our work on Patreon\:\n{1}\n\nSorry for the inconvenience\! You might want to try again later. This message usually only appears at peak time. -tryLater=Please try again later. -skipUserSingle=Skipped {0} added by {1}. -skipUserMultiple=Skipped {0} tracks added by {1}. -skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. -voteSkipAdded=Your vote has been added\! -voteSkipAlreadyVoted=You already voted to skip this track\! -voteSkipSkipping={0} have voted to skip. Skipping track {1}. -voteSkipNotEnough={0} have voted to skip. At least {1} needed. -voteSkipEmbedNoVotes=No votes to skip this track yet. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track -mathOperationResult=The result is -mathOperationDivisionByZeroError=I cannot divide by zero. -mathOperationInfinity=The number is too big to be displayed\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +tryLater=\u041c\u043e\u043b\u044f, \u043e\u043f\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0442\u043d\u043e\u0432\u043e \u043f\u043e-\u043a\u044a\u0441\u043d\u043e. +skipUserSingle=\u041f\u0440\u043e\u043f\u0443\u0441\u043d\u0430\u0442 {0} \u0434\u043e\u0431\u0430\u0432\u0435\u043d \u043e\u0442 {1}. +skipUserMultiple=\u041f\u0440\u043e\u043f\u0443\u0441\u043d\u0430\u0442\u0438 {0} \u043f\u0435\u0441\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u0435\u043d\u0438 \u043e\u0442 {1}. +skipUsersMultiple=\u041f\u0440\u043e\u043f\u0443\u0441\u043d\u0430\u0442\u0438 {0} \u043f\u0435\u0441\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u0435\u043d\u0438 \u043e\u0442 {1} \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f. +skipUserNoTracks=\u041d\u0438\u043a\u043e\u0439 \u043e\u0442 \u0441\u043f\u043e\u043c\u0435\u043d\u0430\u0442\u0438\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u043d\u044f\u043c\u0430 \u043f\u0435\u0441\u043d\u0438 \u0432 \u043e\u043f\u0430\u0448\u043a\u0430\u0442\u0430. +voteSkipAdded=\u0412\u0430\u0448\u0438\u044f\u0442 \u0433\u043b\u0430\u0441 \u0435 \u0434\u043e\u0431\u0430\u0432\u0435\u043d\! +voteSkipAlreadyVoted=\u0412\u0435\u0447\u0435 \u0441\u0442\u0435 \u0433\u043b\u0430\u0441\u0443\u0432\u0430\u043b\u0438 \u0434\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043d\u0435\u0442\u0435 \u0442\u0430\u0437\u0438 \u043f\u0435\u0441\u0435\u043d\! +voteSkipSkipping={0} \u0441\u0430 \u0433\u043b\u0430\u0441\u0443\u0432\u0430\u043b\u0438 \u0437\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043d\u0435. \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043d\u0435 \u043d\u0430 \u043f\u0435\u0441\u0435\u043d {1}. +voteSkipNotEnough={0} \u0441\u0430 \u0433\u043b\u0430\u0441\u0443\u0432\u0430\u043b\u0438 \u0437\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043d\u0435. \u041f\u043e\u043d\u0435 {1} \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0438. +voteSkipEmbedNoVotes=\u0412\u0441\u0435 \u043e\u0449\u0435 \u043d\u044f\u043c\u0430 \u0433\u043b\u0430\u0441\u043e\u0432\u0435 \u0437\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043d\u0435 \u043d\u0430 \u0442\u0430\u0437\u0438 \u043f\u0435\u0441\u0435\u043d. +voteSkipEmbedVoters={0} \u043e\u0442 {1} \u0441\u0430 \u0433\u043b\u0430\u0441\u0443\u0432\u0430\u043b\u0438 \u0437\u0430 \u0434\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u0442\u0430 \u043f\u0435\u0441\u0435\u043d +mathOperationResult=\u0420\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u0430 \u0435 +mathOperationDivisionByZeroError=\u041d\u0435 \u043c\u043e\u0433\u0430 \u0434\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f \u043d\u0430 \u043d\u0443\u043b\u0430. +mathOperationInfinity=\u0427\u0438\u0441\u043b\u043e\u0442\u043e \u0435 \u043f\u0440\u0435\u043a\u0430\u043b\u0435\u043d\u043e \u0433\u043e\u043b\u044f\u043c\u043e \u0437\u0430 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e\! +prefix=\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043a\u0430 +prefixGuild=\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0437\u0430 \u0442\u0430\u0437\u0438 \u0433\u0438\u043b\u0434\u0438\u044f \u0435 {0} +prefixShowAgain=\u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u043e\u0442\u043d\u043e\u0432\u043e \u043f\u043e \u0432\u0441\u044f\u043a\u043e \u0432\u0440\u0435\u043c\u0435, \u043a\u0430\u0442\u043e \u043c\u0435 \u0441\u043f\u043e\u043c\u0435\u043d\u0435\u0442\u0435. +moduleAdmin=\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f +moduleInfo=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +moduleConfig=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 +moduleMusic=\u041c\u0443\u0437\u0438\u043a\u0430 +moduleModeration=M\u043e\u0434\u0435\u0440\u0438\u0440\u0430\u043d\u0435 +moduleUtility=\u041f\u043e\u043b\u0435\u0437\u043d\u043e +moduleFun=\u0417\u0430\u0431\u0430\u0432\u0430 +moduleLocked=\u041c\u043e\u0434\u0443\u043b\u0430 {0} \u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d/\u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d. +moduleCantParse=\u041d\u044f\u043c\u0430 \u0442\u0430\u043a\u044a\u0432 \u043c\u043e\u0434\u0443\u043b. \u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0441\u043f\u0438\u0441\u044a\u043a \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u043d\u0438\u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441 {0} +moduleStatus=\u0421\u0442\u0430\u0442\u0443\u0441 \u043d\u0430 \u041c\u043e\u0434\u0443\u043b\u0430 +moduleDisable=\u0414\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d \u043c\u043e\u0434\u0443\u043b {0}. +moduleEnable=\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d \u043c\u043e\u0434\u0443\u043b {0}. +moduleShowCommands=\u041a\u0430\u0436\u0435\u0442\u0435 {0} \u0437\u0430 \u0434\u0430 \u0432\u0438\u0434\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0438\u0442\u0435 \u043d\u0430 \u0442\u043e\u0437\u0438 \u043c\u043e\u0434\u0443\u043b. +modulesCommands=\u041a\u0430\u0436\u0435\u0442\u0435 {0} \u0437\u0430 \u0434\u0430 \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0438 \u0437\u0430 \u0434\u0430\u0434\u0435\u043d \u043c\u043e\u0434\u0443\u043b \u0438\u043b\u0438 {1} \u0434\u0430 \u0431\u044a\u0434\u0430\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0438. +modulesEnabledInGuild=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u0437\u0430 \u0442\u0430\u0437\u0438 \u0433\u0438\u043b\u0434\u0438\u044f\: +modulesHowTo=\u041d\u0430\u043f\u0438\u0448\u0438 {0} \u0437\u0430 \u0434\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435/\u0437\u0430\u0431\u0440\u0430\u043d\u0438\u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u0438. diff --git a/FredBoat/src/main/resources/lang/bn_BD.properties b/FredBoat/src/main/resources/lang/bn_BD.properties index a2e81a5a2..82cb6c4ea 100644 --- a/FredBoat/src/main/resources/lang/bn_BD.properties +++ b/FredBoat/src/main/resources/lang/bn_BD.properties @@ -25,19 +25,19 @@ skipEmpty=\u0987\u099f \u0987\u099c \u098f\u09ae\u09cd\u09aa\u099f\u09bf\! skipOutOfBounds=\u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 \u09a8\u09ae\u09cd\u09ac\u09b0 {0} \u09af\u0996\u09a8 {1} \u099f\u09cd\u09b0\u09be\u0995 \u098f\u0995\u09ae\u09be\u09a4\u09cd\u09b0 \u0985\u09aa\u09b8\u09be\u09b0\u09a3 \u0995\u09b0\u09a4\u09c7 \u09aa\u09be\u09b0\u099b\u09bf \u09a8\u09be\u0964. skipNumberTooLow=\u09a8\u09ae\u09cd\u09ac\u09b0 \u09a6\u09c7\u0993\u09af\u09bc\u09be 0 \u099a\u09c7\u09af\u09bc\u09c7 \u09ac\u09c7\u09b6\u09bf \u09b9\u09ac\u09c7\u0964\! skipSuccess=\u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 \#{0} \u098f\u09a1\u09bc\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u0993\u09af\u09bc\u09be, * *{1} * * -skipRangeInvalid=Specified track range is invalid. -skipRangeSuccess=Tracks \#{0} to \#{1} have been removed. -skipTrackNotFound=Couldn't find track to skip. -stopAlreadyEmpty=The queue was already empty. -stopEmptyOne=The queue has been emptied, `1` track has been removed. -stopEmptySeveral=The queue has been emptied, `{0}` tracks have been removed. -stopAccessDenied=In order to prevent abuse, this command is only available to those who can manage messages. -unpauseQueueEmpty=The queue is empty. -unpausePlayerNotPaused=The player is not paused. -unpauseNoUsers=There are no users in the voice chat. -unpauseSuccess=The player is now unpaused. -volumeApology=Sorry\! The ;;volume command has now been deprecated on the public music bot. This is because of how it causes the bot to spend a lot more time processing audio, some tracks up to 5 times more, causing everyone to hear stutter. By disabling this feature FredBoat can play much more music without lag.\nI recommend setting the bot's volume via the dropdown menu https\://fred.moe/1vD.png -volumeSyntax=Use `;;volume <0-150>`. {0}% is the default.\nThe player is currently at **{1}%**. +skipRangeInvalid=\u09a8\u09bf\u09b0\u09cd\u09a6\u09bf\u09b7\u09cd\u099f \u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 \u09b8\u09c0\u09ae\u09be\u099f\u09bf \u09ac\u09c8\u09a7 \u09a8\u09af\u09bc\u0964. +skipRangeSuccess=\u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 \#{0} \u099c\u09a8\u09cd\u09af \#{1} \u0995\u09b0\u09c7 \u09aa\u09cd\u09b0\u09a4\u09cd\u09af\u09be\u09b9\u09be\u09b0 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964\! +skipTrackNotFound=\u09ab\u09b2\u09be\u09ab\u09b2 \u09aa\u09b0\u09c0\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09be\u09b0 \u099c\u09a8\u09cd\u09af \u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 \u0996\u09c1\u0981\u099c\u09c7 \u09aa\u09be\u099a\u09cd\u099b\u09c7 \u09a8\u09be\u0964 +stopAlreadyEmpty=\u09b2\u09be\u0987\u09a8\u09c7 \u0986\u0997\u09c7\u0987 \u09ab\u09be\u0981\u0995\u09be \u099b\u09bf\u09b2\u0964 +stopEmptyOne=\u09b2\u09be\u0987\u09a8\u09c7 \u09b6\u09c7\u09b7 \u09b9\u09af\u09bc\u09c7 \u0997\u09c7\u099b\u09c7, \u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 '1' \u0985\u09aa\u09b8\u09be\u09b0\u09a3 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 +stopEmptySeveral=\u09b2\u09be\u0987\u09a8\u09c7 \u09b6\u09c7\u09b7 \u09b9\u09af\u09bc\u09c7 \u0997\u09c7\u099b\u09c7, \u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 '1' \u0985\u09aa\u09b8\u09be\u09b0\u09a3 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 +stopAccessDenied=\u0985\u09aa\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u09b0\u09cb\u09a7 \u0995\u09b0\u09be\u09b0 \u099c\u09a8\u09cd\u09af, \u098f\u0987 \u0986\u09a6\u09c7\u09b6 \u09a4\u09cb \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09c7 \u09ac\u09be\u09b0\u09cd\u09a4\u09be\u0997\u09c1\u09b2\u09bf \u09aa\u09b0\u09bf\u099a\u09be\u09b2\u09a8\u09be \u0995\u09b0\u09a4\u09c7 \u09aa\u09be\u09b0\u09c7\u09a8\u0964 +unpauseQueueEmpty=\u09b2\u09be\u0987\u09a8\u09c7 \u0996\u09be\u09b2\u09bf \u0986\u099b\u09c7\u0964 +unpausePlayerNotPaused=\u09aa\u09cd\u09b2\u09c7\u09af\u09bc\u09be\u09b0 \u09ac\u09bf\u09b0\u09a4 \u09b9\u09af\u09bc \u09a8\u09be\u0964 +unpauseNoUsers=\u09ad\u09af\u09bc\u09c7\u09b8 \u099a\u09cd\u09af\u09be\u099f\u09c7 \u0995\u09cb\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0\u0995\u09be\u09b0\u09c0. +unpauseSuccess=\u09b8\u09cd\u09ac\u09aa \u0995\u09ae\u09aa\u09cd\u09b2\u09bf\u099f +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: +volumeSyntax=\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c1\u09a8 ''\u0964; <0-150> \u09ad\u09b2\u09bf\u0989\u09ae ''\u0964 {0} \u09b6\u09a4\u09be\u0982\u09b6\u0964 \u09aa\u09c2\u09b0\u09cd\u09ac-\u09a8\u09bf\u09b0\u09cd\u09a7\u09be\u09b0\u09bf\u09a4\u0964 \u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8\u09c7 \u098f \u0996\u09c7\u09b2\u09cb\u09af\u09bc\u09be\u09a1\u09bc * *{1}% * *\u0964 volumeSuccess=Changed volume from **{0}%** to **{1}%**. exportEmpty=Nothing to export, the queue is empty. exportPlaylistResulted=Exported playlist\: {0}\nYou can provide this URL to play the current playlist later. @@ -127,6 +127,7 @@ luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} second helpSuccess=Documentation has been sent to your direct messages\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=Say {0} to learn what this bot can do\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=No such users brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderation commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/ca_ES.properties b/FredBoat/src/main/resources/lang/ca_ES.properties index a437e2251..daeadc058 100644 --- a/FredBoat/src/main/resources/lang/ca_ES.properties +++ b/FredBoat/src/main/resources/lang/ca_ES.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=La cua \u00e9s buida. unpausePlayerNotPaused=El reproductor no est\u00e0 en pausa. unpauseNoUsers=No hi ha cap usuari al xat de veu. unpauseSuccess=El reproductor a sigut despausat. -volumeApology=Ho sento\! El comand ;;volume ha estat censurat al bot de m\u00fasica public. Aix\u00f3 es a cause de que el bot gasta molt m\u00e9s temps processant l'audio, algunes pistes fins a 5 minuts, causant que les pistes es parin o trabin. Deshabilitant aquesta caracteristica, FredBoat pot reprodu\u00efr m\u00fasica amb molt menys lag. \nRecomano cambiar el vol\u00fam del bot al menu desplegable\: https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Utilitzi `;;volume <0-150>`. {0}% es el vol\u00fam predeterminat.\nEl reproductor es actualment a **{1}%**. volumeSuccess=Canviat el vol\u00fam de **{0}%** a **{1}%**. exportEmpty=Res per exportar, la cua \u00e9s buida. @@ -127,6 +127,7 @@ luaTimeout=\ Funci\u00f3 fora de temps \:anger\: el temps de computaci\u00f3 per helpSuccess=S'ha enviat documentaci\u00f3 per missatge directe\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=Digues {0} per saber qu\u00e8 pot fer aquest bot\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=No hi ha tal usuari brainfuckCycleLimit=El programa ha superat el maxim numero de cicles de {0} brainfuckDataPointerOutOfBounds=Punter fora dels l\u00edmits\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderation commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/cs_CZ.properties b/FredBoat/src/main/resources/lang/cs_CZ.properties index 66167e045..9a238b55a 100644 --- a/FredBoat/src/main/resources/lang/cs_CZ.properties +++ b/FredBoat/src/main/resources/lang/cs_CZ.properties @@ -30,13 +30,13 @@ skipRangeSuccess=Skladby od \#{0} do \#{1} byly smaz\u00e1ny. skipTrackNotFound=Nelze naj\u00edt stopu pro p\u0159esko\u010den\u00ed. stopAlreadyEmpty=Fronta byla u\u017e pr\u00e1zdn\u00e1. stopEmptyOne=Fronta vypr\u00e1zdn\u011bna, `1` stopa byla smaz\u00e1na. -stopEmptySeveral=Fronta vypr\u00e1zdn\u011bna, `{0}` stop bylo smaz\u00e1no. +stopEmptySeveral=Fronta vypr\u00e1zdn\u011bna, `1` stopa byla smaz\u00e1na. stopAccessDenied=S c\u00edlem zabr\u00e1nit zneu\u017e\u00edv\u00e1n\u00ed, tento p\u0159\u00edkaz je k dispozici pouze t\u011bm, kte\u0159\u00ed mohou spravovat zpr\u00e1vy. unpauseQueueEmpty=Fronta je pr\u00e1zdn\u00e1. unpausePlayerNotPaused=P\u0159ehr\u00e1va\u010d nen\u00ed pozastaven. unpauseNoUsers=V hlasov\u00e9 m\u00edstnosti nejsou \u017e\u00e1dn\u00ed u\u017eivatel\u00e9. unpauseSuccess=P\u0159ehr\u00e1va\u010d bude nyn\u00ed hr\u00e1t. -volumeApology=Omlouv\u00e1me se, p\u0159\u00edkaz ;;volume byl odstran\u011bn z ve\u0159ejn\u00e9ho hudebn\u00edho botu. Je to d\u00edky tomu, \u017ee spot\u0159ebov\u00e1v\u00e1 mnoho \u010dasu zpracov\u00e1v\u00e1n\u00edm zvuku, u n\u011bkter\u00fdch stop a\u017e p\u011btin\u00e1sobn\u011b, co\u017e zp\u016fsobuje zasek\u00e1v\u00e1n\u00ed pro v\u0161echny. Zak\u00e1z\u00e1n\u00edm t\u00e9to funkce m\u016f\u017ee FredBoat p\u0159ehr\u00e1vat mnohem v\u00edce hudby plynule.\nDoporu\u010duji nastavit hlasitost botu v menu po kliknut\u00ed prav\u00fdm tla\u010d\u00edtkem\: https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Pou\u017eijte `;;volume <0-150>`. {0}% je v\u00fdchoz\u00ed.\nP\u0159ehr\u00e1va\u010d je moment\u00e1ln\u011b na **{1}%**. volumeSuccess=Hlasitost zm\u011bn\u011bna z **{0}%** na **{1}%**. exportEmpty=Nic pro export, fronta je pr\u00e1zdn\u00e1. @@ -127,6 +127,7 @@ luaTimeout=\ Funkce vypr\u0161ela \:anger\: povolen\u00fd v\u00fdpo\u010detn\u00 helpSuccess=Dokumentace ti byla zasl\u00e1na jako p\u0159\u00edm\u00e1 zpr\u00e1va\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=\u0158ekn\u011bte {0} a poznejte, co dok\u00e1\u017ee tento bot\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=\u017d\u00e1dn\u00fd takov\u00fd u\u017eivatel brainfuckCycleLimit=Program p\u0159ekro\u010dil maxim\u00e1ln\u00ed po\u010det cykl\u016f pro {0} brainfuckDataPointerOutOfBounds=Datov\u00fd ukazatel mimo hranice\: {0} @@ -157,7 +158,7 @@ softbanSuccess=U\u017eivatel {0}\#{1} [{2}] byl softbanov\u00e1n. softbanFailSelf=Nem\u016f\u017eete softbanovat sami sebe. softbanFailOwner=Nem\u016f\u017eete softbanovat vlastn\u00edka serveru. softbanFailMyself=Nemohu softbanovat s\u00e1m sebe. -hardbanSuccess=User {0}\#{1} [{2}] has been banned. +hardbanSuccess=U\u017eivatel {0}\#{1} [{2}] byl zabanov\u00e1n. hardbanFailSelf=Nem\u016f\u017eete zabanovat sami sebe. hardbanFailOwner=Nem\u016f\u017eete zabanovat vlastn\u00edka serveru. hardbanFailMyself=Nem\u016f\u017eu se s\u00e1m zabanovat. @@ -192,7 +193,7 @@ serverinfoVoice=Hlasov\u00e9 kan\u00e1ly\: serverinfoGuildID=Guild ID\: serverinfoCreationDate=Datum vytvo\u0159en\u00ed\: serverinfoOwner=Vlastn\u00edk\: -serverinfoVLv=Verification Level\: +serverinfoVLv=Ov\u011b\u0159ovac\u00ed level\: userinfoTitle=Information about {0}\: userinfoUsername=U\u017eivatelsk\u00e9 jm\u00e9no\: userinfoId=ID\: @@ -211,6 +212,7 @@ commandsModeration=Moderov\u00e1n\u00ed commandsMaintenance=\u00dadr\u017eba commandsBotOwner=Vlastn\u00edk bota commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Nezn\u00e1m\u00fd p\u0159\u00edkaz. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Spr\u00e1vn\u00e9 pou\u017eit\u00ed\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Zabanovat u\u017eivatele a odstranit jeho zpr\u00e1vy z posledn\u00edch 7 dn\u016f. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softbanovat u\u017eivatele vyhozen\u00edm a odstran\u011bn\u00edm jeho zpr\u00e1v z posledn\u00edch 7 dn\u016f. @@ -274,7 +277,7 @@ helpMathOperationPow=Print the result of num1^num2. destroyDenied=You must have the manage messages permission to reset the player. destroyHelp=Reset the player and clear the playlist. Reserved for moderators with Manage Messages permission. destroySucc=Reset the player and cleared the queue. -listPageNum=Page **{0}** of **{1}**. +listPageNum=Strana **{0}** z **{1}**. permsListTitle=Users and roles with the {0} permissions permsAdded=Added `{0}` to `{1}`. permsRemoved=Removed `{0}` from `{1}`. @@ -285,7 +288,7 @@ fuzzyMultiple=Multiple items were found. Did you mean any of these? fuzzyNothingFound=Nothing found for `{0}`. cmdPermsTooLow=Nem\u00e1te opr\u00e1vn\u011bn\u00ed ke spu\u0161t\u011bn\u00ed tohoto p\u0159\u00edkazu\! Tento p\u0159\u00edkaz vy\u017eaduje `{0}`, ale m\u00e1te pouze `{1}`. playersLimited=FredBoat is currently at maximum capacity\! The bot is currently fixed to only play up to `{0}` streams, otherwise we would risk disconnecting from Discord under the network load.\nIf you want to help us increase the limit or you want to use our non-overcrowded bot, please support our work on Patreon\:\n{1}\n\nSorry for the inconvenience\! You might want to try again later. This message usually only appears at peak time. -tryLater=Please try again later. +tryLater=Zkuste to pros\u00edm pozd\u011bji. skipUserSingle=Skipped {0} added by {1}. skipUserMultiple=Skipped {0} tracks added by {1}. skipUsersMultiple=Skipped {0} tracks added by {1} users. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/cy_GB.properties b/FredBoat/src/main/resources/lang/cy_GB.properties index eff733512..6490e331e 100644 --- a/FredBoat/src/main/resources/lang/cy_GB.properties +++ b/FredBoat/src/main/resources/lang/cy_GB.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=Mae'r ciw yn wag. unpausePlayerNotPaused=Nid yw y chwaraewr wedi rhewi. unpauseNoUsers=Nad oes unrhyw ddefnyddwyr mewn sianel llais. unpauseSuccess=Bellach mae'r chwaraewr yn chwarae. -volumeApology=Mae'n ddrwg gen i\! Mae'r gorchymyn ;;volume bellach wedi'i anghymeradwyo ar bot cerddoriaeth gyhoeddus. Mae hyn oherwydd sut mae'n peri y bot i dreulio llawer mwy o amser prosesu sain, gyda rhai traciau rhai hyd at 5 gwaith yn fwy, sy'n achosi pawb glywed stutter. Trwy analluogi'r nodwedd hon gall FredBoat yn chwarae llawer mwy o gerddoriaeth heb oedi. Yr wyf yn argymell pennu maint y bot drwy https\://fred.moe/1vD.png Dewislen cwymprestr +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Defnyddio `;;volume <0-150>''. {0}% yw''r rhagosodiad. Ar hyn o bryd mae''r chwaraewr ar **{1}%**. volumeSuccess=Newidiwyd y sain o ** {0}%* i **{1}%**. exportEmpty=Nid oes dim i allgludo, mae'r ciw yn wag. @@ -127,6 +127,7 @@ luaTimeout=\ Swyddogaeth i ben \:anger\: caniat\u00e1u gyfrifiannu amser yn {0} helpSuccess=Mae dogfennaeth wedi'i anfon at eich negeseuon uniongyrchol\! helpDmFailed=Gellid nid yn anfon dogfennau at eich DMs. Gwnewch yn si\u0175r nad oes yn rhaid iddynt anabl\! helpCommandsPromotion=Dweud {0} i ddysgu beth hwn bot y gall wneud\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Dim defnyddwyr o'r fath brainfuckCycleLimit=Roedd rhaglen Rhagori ar gyfrif y cylch uchaf o {0} brainfuckDataPointerOutOfBounds=Pwyntydd ddata fannu\: {0} @@ -211,6 +212,7 @@ commandsModeration=Cymedroli commandsMaintenance=Cynnal commandsBotOwner=Perchennog bot commandsMoreHelp=Dweud {0} i gael rhagor o wybodaeth ar Gorchymyn penodol. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Gorchymyn anhysbys. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Defnydd priodol\: helpCommandOwnerRestricted=Gorchymyn hwn wedi'i gyfyngu i berchennog y bot. helpConfigCommand=Dangos config hwn Urdd neu addasu gosodiadau. helpLanguageCommand=Dangos ieithoedd sydd ar gael neu osod iaith hwn Urdd. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Wahardd defnyddiwr a dileu ei negeseuon o y 7 diwrnod diwethaf. helpKickCommand=Cicio defnyddiwr o'r Urdd hwn. helpSoftbanCommand=Softban defnyddiwr gan cicio ef a dileu ei negeseuon gan y 7 diwrnod diwethaf. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/da_DK.properties b/FredBoat/src/main/resources/lang/da_DK.properties index fdc5db773..e82665765 100644 --- a/FredBoat/src/main/resources/lang/da_DK.properties +++ b/FredBoat/src/main/resources/lang/da_DK.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=K\u00f8en er tom. unpausePlayerNotPaused=Afspilleren er ikke sat p\u00e5 pause. unpauseNoUsers=Der er ingen brugere i voice chat. unpauseSuccess=Spilleren er nu ikke l\u00e6ngere sat p\u00e5 pause. -volumeApology=Beklager\! ;;voulme kommandoen er udg\u00e5et p\u00e5 den offentlige musik bot. Dette er fordi at den for\u00e5rsager botten til at bruge meget mere tid til at behandle lyd, nogen spor op til 5 gange mere, hvilket for\u00e5rsager at alle h\u00f8rer stammelser. Ved at deaktivere denne funktion kan botten spille meget mere musik uden lag.\nJeg anbefaler at s\u00e6tte bottens volumen via dropdown menuen https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Brug `;;volume <0-150>`. {0}% er standard.\nAfspilleren er i \u00f8jeblikket p\u00e5 **{1}%**. volumeSuccess=\u00c6ndrede volumen fra **{0}%** til **{1}%**. exportEmpty=Intet at eksportere, k\u00f8en er tom. @@ -127,6 +127,7 @@ luaTimeout=\ Funktionen timeout \:anger\: tilladt computation tid er {0} sekunde helpSuccess=Dokumentation er blevet sendt til dine direkte meddelelser\! helpDmFailed=Kunne ikke sende dokumentationen til DMs. Kontroller, at du ikke har deaktiveret dem\! helpCommandsPromotion=Sig {0} for at f\u00e5 at vide hvad denne bot kan g\u00f8re\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Ingen s\u00e5danne brugere brainfuckCycleLimit=Programet overskrev det maksimale antal cyklusser af {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderering commandsMaintenance=Vedligeholdelse commandsBotOwner=Bot ejeren commandsMoreHelp=Sig {0} for at f\u00e5 flere oplysninger om en bestemt kommando. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Ukendt kommando. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Korrekt anvendelse\: helpCommandOwnerRestricted=Denne kommando er begr\u00e6nset til ejeren af botten. helpConfigCommand=Vis config af denne server eller justere indstillingerne. helpLanguageCommand=Vis tilg\u00e6ngelige sprog eller angive et sprog for denne server. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban en bruger og slet hans beskedder fra de sidste 7 dage. helpKickCommand=Kick en bruger fra denne server. helpSoftbanCommand=Softban en bruger ved at kicke ham og slette hans beskedder fra de sidste 7 dage. @@ -302,4 +305,20 @@ mathOperationInfinity=Antallet er for stort til at blive vist\! prefix=Pr\u00e6fiks prefixGuild=Pr\u00e6fikset for denne guild er {0} prefixShowAgain=Du kan vise pr\u00e6fikset igen til en hver tid ved at n\u00e6vne mig. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/de_DE.properties b/FredBoat/src/main/resources/lang/de_DE.properties index 8995a7e05..ccb78b40a 100644 --- a/FredBoat/src/main/resources/lang/de_DE.properties +++ b/FredBoat/src/main/resources/lang/de_DE.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=Die Warteschlange ist leer. unpausePlayerNotPaused=Der Spieler ist nicht angehalten. unpauseNoUsers=Es sind keine Nutzer im Sprachchat. unpauseSuccess=Der Spieler wird nun fortgesetzt. -volumeApology=Entschuldigung\! Der `;;volume`-Befehl wurde auf dem \u00f6ffentlichen Musikbot abgeschaltet. Grund hierf\u00fcr ist, dass der Bot deutlich (bis zu 5x) mehr Zeit ben\u00f6tigt, um die Audiospur zu verarbeiten, sodass jeder Stottern h\u00f6rt. Durch das Deaktivieren dieser Funktion kann FredBoat viel mehr Musik ohne Verz\u00f6gerung abspielen.\nIch empfehle die Bot-Lautst\u00e4rke \u00fcber das Aufklappmen\u00fc zu \u00e4ndern https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Benutze `;;volume <0-150>`. {0}% ist die Standardeinstellung.\nDer Spieler ist momentan bei **{1}%**. volumeSuccess=Lautst\u00e4rke von **{0}%** auf **{1}%** ge\u00e4ndert. exportEmpty=Nichts zu exportieren, die Warteschlange ist leer. @@ -127,6 +127,7 @@ luaTimeout=\ Zeit\u00fcberschreitung der Funktion. \:anger\: erlaubte Berechnung helpSuccess=Dokumentation wurde zu Deinen Direktnachrichten gesendet\! helpDmFailed=Konnte Dokumentation nicht senden. Bitte \u00fcberpr\u00fcfe ob du DMs aktiviert hast\! helpCommandsPromotion=Sag {0}, um zu erfahren, was dieser Bot machen kann\! +musicCommandsPromotion=Sagen Sie {0} um eine vollst\u00e4ndige Liste der Musik-Befehle zu sehen. fuzzyNoResults=Besagter Nutzer existiert nicht brainfuckCycleLimit=Programm \u00fcberschritt die maximale Zyklenzahl von {0} brainfuckDataPointerOutOfBounds=Daten Zeiger au\u00dferhalb des g\u00fcltigen Bereichs\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderation commandsMaintenance=Wartung commandsBotOwner=Boteigent\u00fcmer commandsMoreHelp=Sag {0}, um mehr Informationen zu einem bestimmten Befehl zu erhalten. +commandsModulesHint=Sie k\u00f6nnen zus\u00e4tzliche Module mit {0} ein- und ausschalten helpUnknownCommand=Unbekannter Befehl. helpDocsLocation=Die Dokumentation befindet sich hier\: helpBotInvite=Willst du FredBoat zu deinem Server hinzuf\u00fcgen? Wenn du die "Server verwalten"-Berechtigung f\u00fcr deine Gilde hast, kannst du FredBoat einladen\: @@ -222,6 +224,7 @@ helpProperUsage=Ordnungsgem\u00e4\u00dfe Verwendung\: helpCommandOwnerRestricted=Dieser Befehl beschr\u00e4nkt sich auf den Besitzer des Bots. helpConfigCommand=Zeigt die Konfiguration dieser Gilde oder passt diese an. helpLanguageCommand=Zeigt Verf\u00fcgbare Sprachen an oder legt diese f\u00fcr die Gilde fest. +helpModules=Anzeige ob Commandmodule f\u00fcr die Gilde ein (enable) oder ausgeschalten (disable) sind. helpHardbanCommand=Banne einen Nutzer und l\u00f6sche die Nachrichten der letzten 7 Tage. helpKickCommand=Kicke einen Nutzer aus dieser Gilde. helpSoftbanCommand=Softbanne einen Nutzer indem er gekickt wird und die Nachrichten der letzten 7 Tage gel\u00f6scht werden. @@ -302,4 +305,20 @@ mathOperationInfinity=Diese Zahl ist zu gro\u00df, um angezeigt zu werden\! prefix=Pr\u00e4fix prefixGuild=Das Pr\u00e4fix f\u00fcr diese Gilde ist {0} prefixShowAgain=Du kannst das Pr\u00e4fix jederzeit wieder anzeigen indem du mich erw\u00e4hnst. +moduleAdmin=Verwaltung +moduleInfo=Information +moduleConfig=Einstellungen +moduleMusic=Musik +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Spa\u00df +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/el_GR.properties b/FredBoat/src/main/resources/lang/el_GR.properties index 21be1d880..f6e641b77 100644 --- a/FredBoat/src/main/resources/lang/el_GR.properties +++ b/FredBoat/src/main/resources/lang/el_GR.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=\u0397 \u03bb\u03af\u03c3\u03c4\u03b1 \u03b5\u03af\u03bd\u03b1 unpausePlayerNotPaused=\u039f player \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03bc\u03c0\u03b5\u03b9 \u03c3\u03b5 \u03c0\u03b1\u03cd\u03c3\u03b7. unpauseNoUsers=\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 \u03c3\u03c4\u03bf \u03ba\u03b1\u03bd\u03ac\u03bb\u03b9. unpauseSuccess=\u039f player \u03c0\u03b1\u03af\u03b6\u03b5\u03b9 \u03ba\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03ac (pause off). -volumeApology=\u03a3\u03c5\u03b3\u03bd\u03ce\u03bc\u03b7\! \u0397 \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae ;;volume \u03ad\u03c7\u03b5\u03b9 \u03ba\u03b1\u03c4\u03b1\u03c1\u03b3\u03b7\u03b8\u03b5\u03af \u03b3\u03b9\u03b1 \u03c4\u03bf Music Bot. \u0391\u03c5\u03c4\u03cc \u03ad\u03b3\u03b9\u03bd\u03b5 \u03b3\u03b9\u03b1\u03c4\u03af \u03c0\u03c1\u03bf\u03ba\u03b1\u03bb\u03b5\u03af \u03c4\u03bf bot \u03bd\u03b1 \u03c0\u03b1\u03af\u03c1\u03bd\u03b5\u03b9 \u03c0\u03bf\u03bb\u03cd \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03bf \u03c7\u03c1\u03cc\u03bd\u03bf \u03c3\u03c4\u03b7\u03bd \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c4\u03b7\u03c2 \u03bc\u03bf\u03c5\u03c3\u03b9\u03ba\u03ae\u03c2 \u03ba\u03b1\u03b9 \u03c3\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b1 \u03ba\u03bf\u03bc\u03bc\u03ac\u03c4\u03b9\u03b1 \u03ad\u03c9\u03c2 5 \u03c6\u03bf\u03c1\u03ad\u03c2 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03bf, \u03c0\u03c1\u03bf\u03ba\u03b1\u03bb\u03ce\u03bd\u03c4\u03b1\u03c2 \u03c4\u03bf\u03bd \u03ba\u03b1\u03b8\u03ad\u03bd\u03b1 \u03bd\u03b1 \u03b1\u03ba\u03bf\u03cd\u03b5\u03b9 \u03bd\u03b1 \u03c4\u03c1\u03b1\u03cd\u03bb\u03b9\u03c3\u03bc\u03b1. \u039c\u03b5 \u03c4\u03b7\u03bd \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b1\u03c5\u03c4\u03ae\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03c4\u03bf FredBoat \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c0\u03b1\u03af\u03be\u03b5\u03b9 \u03c0\u03bf\u03bb\u03cd \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b7 \u03bc\u03bf\u03c5\u03c3\u03b9\u03ba\u03ae \u03c7\u03c9\u03c1\u03af\u03c2 \u03ba\u03b1\u03b8\u03c5\u03c3\u03c4\u03ad\u03c1\u03b7\u03c3\u03b7. \u0398\u03b1 \u03ae\u03b8\u03b5\u03bb\u03b1 \u03bd\u03b1 \u03c3\u03c5\u03c3\u03c4\u03ae\u03c3\u03c9 \u03c1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03ad\u03bd\u03c4\u03b1\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 bot \u03bc\u03ad\u03c3\u03c9 \u03c4\u03bf\u03c5 \u03b1\u03bd\u03b1\u03c0\u03c4\u03c5\u03c3\u03c3\u03cc\u03bc\u03b5\u03bd\u03bf \u03bc\u03b5\u03bd\u03bf\u03cd \u03c3\u03c4\u03bf discord https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\u03a7\u03c1\u03ae\u03c3\u03b7 _;;volume <0-150>_ {0}% \u03b5\u03af\u03bd\u03b1\u03b9 \u03b7 \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae. \u03a4\u03bf player \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03ce\u03c1\u03b1 \u03c3\u03c4\u03bf **{1}%**. volumeSuccess=\u0388\u03b3\u03b9\u03bd\u03b5 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03c4\u03b7\u03c2 \u03ad\u03bd\u03c4\u03b1\u03c3\u03b7\u03c2 \u03b1\u03c0\u03cc **{0}% ** \u03c3\u03c4\u03bf **{1}% **. exportEmpty=\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03c4\u03af\u03c0\u03bf\u03c4\u03b1 \u03b3\u03b9\u03b1 \u03b5\u03be\u03b1\u03b3\u03c9\u03b3\u03ae, \u03b7 \u03bb\u03af\u03c3\u03c4\u03b1 \u03b1\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03ba\u03b5\u03bd\u03ae. @@ -127,6 +127,7 @@ luaTimeout=\ H \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03 helpSuccess=\u03a4\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 \u03b2\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1\u03c2 \u03ad\u03c7\u03bf\u03c5\u03bd \u03b1\u03c0\u03bf\u03c3\u03c4\u03b1\u03bb\u03b5\u03af \u03c3\u03c4\u03bf DM \u03c3\u03b1\u03c2\! helpDmFailed=\u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03ce \u03bd\u03b1 \u03c3\u03bf\u03c5 \u03c3\u03c4\u03b5\u03af\u03bb\u03c9 \u03c4\u03b7 \u03c4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7 \u03c3\u03c4\u03b1 \u03ac\u03bc\u03b5\u03c3\u03b1 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03b1 \u03c3\u03bf\u03c5. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03ad\u03bb\u03b5\u03b3\u03be\u03b5 \u03cc\u03c4\u03b9 \u03b4\u03b5\u03bd \u03c4\u03b1 \u03ad\u03c7\u03b5\u03b9\u03c2 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b1\! helpCommandsPromotion=\u03a0\u03b5\u03af\u03c4\u03b5 {0} \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03bc\u03ac\u03b8\u03b5\u03c4\u03b5 \u03c4\u03b9 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03b9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf bot\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03c4\u03ad\u03c4\u03bf\u03b9\u03bf\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7\u03c2 brainfuckCycleLimit=\u03a4\u03bf \u03c0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03c5\u03c0\u03b5\u03c1\u03b2\u03b5\u03af \u03c4\u03bf \u03bc\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf \u03ba\u03cd\u03ba\u03bb\u03bf \u03c4\u03bf\u03c5 {0} brainfuckDataPointerOutOfBounds=\u0394\u03b5\u03af\u03ba\u03c4\u03b7\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b5\u03ba\u03c4\u03cc\u03c2 \u03bf\u03c1\u03af\u03c9\u03bd\: {0} @@ -211,6 +212,7 @@ commandsModeration=\u0395\u03c0\u03bf\u03c0\u03c4\u03b5\u03af\u03b1 commandsMaintenance=\u03a3\u03c5\u03bd\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 commandsBotOwner=\u0399\u03b4\u03b9\u03bf\u03ba\u03c4\u03ae\u03c4\u03b7\u03c2 bot commandsMoreHelp=\u03a0\u03b5\u03af\u03c4\u03b5 {0} \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c0\u03ac\u03c1\u03b5\u03c4\u03b5 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03bc\u03b9\u03b1 \u03c3\u03c5\u03b3\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03b7 \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=\u0386\u03b3\u03bd\u03c9\u03c3\u03c4\u03b7 \u0395\u03bd\u03c4\u03bf\u03bb\u03ae. helpDocsLocation=\u03a4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b2\u03c1\u03b5\u03b8\u03b5\u03af \u03c3\u03b5\: helpBotInvite=\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03b5\u03c4\u03b5 FredBoat \u03c3\u03c4\u03bf \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2; \u0395\u03ac\u03bd \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b4\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03b1 \u03b4\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7\u03c2 \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03c3\u03c5\u03bd\u03c4\u03b5\u03c7\u03bd\u03af\u03b1 \u03c3\u03b1\u03c2, \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03ba\u03b1\u03bb\u03ad\u03c3\u03b5\u03c4\u03b5 FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=\u03a3\u03c9\u03c3\u03c4\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7\: helpCommandOwnerRestricted=\u0391\u03c5\u03c4\u03ae \u03b7 \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c3\u03c4\u03bf\u03bd \u03b9\u03b4\u03b9\u03bf\u03ba\u03c4\u03ae\u03c4\u03b7 \u03c4\u03bf\u03c5 bot. helpConfigCommand=\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c4\u03bf config \u03b1\u03c0\u03cc \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf guild \u03ae \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03cc\u03c3\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2. helpLanguageCommand=\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03c9\u03bd \u03b3\u03bb\u03c9\u03c3\u03c3\u03ce\u03bd \u03ae \u03bd\u03b1 \u03bf\u03c1\u03af\u03c3\u03b5\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=\u0391\u03c0\u03b1\u03b3\u03cc\u03c1\u03b5\u03c5\u03c3\u03b7 \u03b5\u03bd\u03cc\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b1 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03ac \u03c4\u03bf\u03c5 \u03b1\u03c0\u03cc \u03c4\u03b9\u03c2 \u03c4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03b5\u03c2 7 \u03b7\u03bc\u03ad\u03c1\u03b5\u03c2. helpKickCommand=\u039a\u03ac\u03bd\u03c4\u03b5 kick \u03ad\u03bd\u03b1 user \u03b1\u03c0\u03cc \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd guild. helpSoftbanCommand=Softban \u03ad\u03bd\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03b2\u03b3\u03ac\u03b6\u03bf\u03bd\u03c4\u03b1\u03c2 \u03c4\u03bf\u03bd \u03ba\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c6\u03bf\u03bd\u03c4\u03b1\u03c2 \u03c4\u03b1 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03ac \u03c4\u03bf\u03c5 \u03b1\u03c0\u03cc \u03c4\u03b9\u03c2 \u03c4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03b5\u03c2 7 \u03b7\u03bc\u03ad\u03c1\u03b5\u03c2. @@ -302,4 +305,20 @@ mathOperationInfinity=\u039f \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03b5\u prefix=\u03a0\u03c1\u03cc\u03b8\u03b5\u03bc\u03b1 prefixGuild=H prefix \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf guild \u03b5\u03af\u03bd\u03b1\u03b9 {0} prefixShowAgain=\u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf prefix \u03b1\u03bd\u03ac \u03c0\u03ac\u03c3\u03b1 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae \u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03bf\u03bd\u03c4\u03ac\u03c2 \u03bc\u03b5. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/en_PT.properties b/FredBoat/src/main/resources/lang/en_PT.properties index f92062410..81701db69 100644 --- a/FredBoat/src/main/resources/lang/en_PT.properties +++ b/FredBoat/src/main/resources/lang/en_PT.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=No sounds be 'n line. unpausePlayerNotPaused=T'e sounds be not held. unpauseNoUsers=E'ry one be out t'e bar. unpauseSuccess=T'e sounds be held no more. -volumeApology=Sor''y\! T''e ;;volume utterence be gone wit'' t''e musik machin''. T''is hap''n''d ''cause it be takin'' to long, som'' sounds 5 tim''s slow''r, makin'' e''ryb''dy t'' h''ar stut''a. Wit'' it gone FredBoat c''n make i''s sounds bet''r.\nI say put t''e machin''''s ''oudne''s in t''e navigation chart https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Utter `;;volume <0-150>`. {0}% be norm''l.\nT''e sounds be at **{1}%**. volumeSuccess=Swit''h''d ''oudne''s from **{0}%** t'' **{1}%**. exportEmpty=Not'in' t' ship, t'e list be em'py. @@ -127,6 +127,7 @@ luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} second helpSuccess=Documentation has been sent to your direct messages\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=Say {0} to learn what this bot can do\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=No pirates found wit' such name brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=Captains commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=The crew dunno yer order. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/en_TS.properties b/FredBoat/src/main/resources/lang/en_TS.properties index 7006118d0..fd9901134 100644 --- a/FredBoat/src/main/resources/lang/en_TS.properties +++ b/FredBoat/src/main/resources/lang/en_TS.properties @@ -25,8 +25,8 @@ skipEmpty=Why would you even want to empty a queue when it is already empty? Cal skipOutOfBounds=Are you blind\! Track {0} doesn''t exist\! chose between 1-{1} idiot\! skipNumberTooLow=What is this\!? Don't give me 0. skipSuccess=It''s not because you asked... I wanted to skip track {0}\: **{1}** anyways. -skipRangeInvalid=Specified track range is invalid. -skipRangeSuccess=Tracks \#{0} to \#{1} have been removed. +skipRangeInvalid=I-it's not like the specific range is invalid, b-baka. +skipRangeSuccess=Tracks \#{0} are \#{1} totally not removed *blushes*. skipTrackNotFound=There is nothing to skip anymore\!\! Can't you just stop skipping songs already\! \:angry\: stopAlreadyEmpty=Are you blind? Can't you see there is nothing\!\!\! stopEmptyOne=I've removed this song of yours from the list. @@ -36,7 +36,7 @@ unpauseQueueEmpty=The queue is empty. Honestly, I don't even care about your stu unpausePlayerNotPaused=Are you deaf? Why would you want to unpause a player that is already playing? unpauseNoUsers=No one will hear you here\! Just go away\! unpauseSuccess=Fine\! I'll continue playing your stupid songs\! -volumeApology=Yeah, I can like try to make you understand it. But that's not why you chose this language. Just use the dropdown menu, mate +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=You have to use `;;volume <0-150>`. Right now it''s at {1}\! Normally it would be at {0}... I''m sick of you not understanding the easy stuff\!\!\! volumeSuccess=Ok fine\! I''ll change it to {1}%. It was at {0}%. Are you impaired\!?\! Can''t turn the volume nob. exportEmpty=Can't you see there's nothing to export? I'm not playing anything right now\! @@ -46,11 +46,11 @@ listShowShuffled=Here, it's all mixed up because of you\! listShowRepeatSingle=This track is on repeat... I may get tired of it someday. But, not right now. listShowRepeatAll=I'm repeating this queue, you know. It's going to go on forever. listShowHistory=It's not like I want to show you your track history but i pity you, so here you go. -listAddedBy=**{0}** added by **{1}** `[{2}]` +listAddedBy=N-no\! **{0}** wasn''t added by **{1}** `[{2}]` listStreamsOnlySingle=There is {0} live {1} in the queue right now. listStreamsOnlyMultiple=There are **{0}** live {1} in the queue right now.\n -listStreamsOrTracksSingle=There is **{0}** {1} with a remaining length of **[{2}]**{3} in the queue. -listStreamsOrTracksMultiple=There are **{0}** {1} with a remaining length of **[{2}]**{3} in the queue. +listStreamsOrTracksSingle=Yes, there is *sigh* **{0}** {1} with the remaining length of **[{2}]**{3} in the queue\! Happy now? Jeez. +listStreamsOrTracksMultiple=Yes, there is *sigh* **{0}** {1} with the remaining length of **[{2}]**{3} in the queue\! Happy now? Jeez. streamSingular=stream streamPlural=streams listAsWellAsLiveStreams=, as well as {0} live {1} @@ -90,7 +90,7 @@ loadPlaylistTooMany=I added {0} tracks... But, there''s too many. No way am I ty loadErrorCommon=Something''s not right\! I couldn''t load the info for `{0}`\: \n{1}\nMust be your fault.. m-mostly. loadErrorSusp=That''s.. weird. It''s strange and I don''t like it\! I couldn''t load the info for '' {0} ''. loadQueueTrackLimit=Why should I add something when there''s already {0} tracks? Anyone (like you) trying to do that would be naughty. -loadAnnouncePlaylist=About to load playlist **{0}** with up to `{1}` tracks. This may take a while, please be patient. +loadAnnouncePlaylist=Well maybe I wasn''t about to load the playlist **{0}** baka, and yes it has up to `{1}`\! Well now that you know, It''s gonna take a while so please be patient. playerUserNotInChannel=You're not in a voice channel, it's rude if you're asking for a song and not gonna listen to it idiot\! playerJoinConnectDenied=I won't go into that voice channel because you want me to\! playerJoinSpeakDenied=I cannot play your song in that channel\! It's for talking not some silly songs of yours. @@ -100,7 +100,7 @@ shutdownUpdating=FredBoat\u266a\u266a is updating\! Just be patient and wait lik shutdownRestarting=FredBoat\u266a\u266a is restarting. I will be right back, then I will continue playing your music. shutdownIndef=FredBoat\u266a\u266a is shutting down. I will now sleep. Do not bother me\! I will play your music when i wake up. shutdownPersistenceFail=Error occurred when saving persistence file\: {0} -reloadSuccess=Reloading playlist. `{0}` tracks found. +reloadSuccess=It''s not like I''m reloading the playlist. Pfft `{0}` tracks found. trackAnnounce=Listen\! {0} is now playing\! cmdAccessDenied=Whaaaat\!? How could you say something like that\!? That command is restricted\! utilErrorOccurred=\ Something went wrong again\! This is all your fault\! \:anger\: ```java\n{0}\n @@ -124,9 +124,10 @@ malUrl={0}**URL\: **{1}\n luaError=\ This stupid moon language thing - or whatever it is - gave me an error \:anger\:\n```{0}``` luaErrorOutputTooBig=That is too long\! \:anger\: I can only type 2000 characters per message\! But you want me to do {0}\!?\!? No way\! luaTimeout=\ Too slow\! \:stuck_out_tongue\: The limit is {0} seconds. -helpSuccess=Documentation has been sent to your direct messages\! +helpSuccess=I''ve privately send you {0} page. Not like You''re special or anything\! helpDmFailed=I couldn't DM you..? Did you block me\!? Why would you do that\!? P-please make sure you don't have DMs disabled. \:sob\: -helpCommandsPromotion=Say {0} to learn what this bot can do\! +helpCommandsPromotion=Don''t say {0} or the bot, well the bot may tell you what it can do... Haha, but it''s not like I wanted to tell you that\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=These users don't exist, much like your friends brainfuckCycleLimit=I''ve reached my limit of {0} cycles\! brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderation commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=I don't even know what you want from me. That command makes no sense. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=This is how you do it b-baka\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -300,6 +303,22 @@ mathOperationResult=The result is mathOperationDivisionByZeroError=I cannot divide by zero. mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefixGuild=Yeah, good job figuring out that the prefix for the guild is {0}. It''s not like I knew it all along and you could''ve asked me. +prefixShowAgain=I can show you the prefix anytime just meantion me, you baka. +moduleAdmin=Administration +moduleInfo=Info +moduleConfig=Config +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/en_US.properties b/FredBoat/src/main/resources/lang/en_US.properties index f711baa10..767bb92c7 100644 --- a/FredBoat/src/main/resources/lang/en_US.properties +++ b/FredBoat/src/main/resources/lang/en_US.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=The queue is empty. unpausePlayerNotPaused=The player is not paused. unpauseNoUsers=There are no users in the voice chat. unpauseSuccess=The player is now unpaused. -volumeApology=Sorry\! The ;;volume command has now been deprecated on the public music bot. This is because of how it causes the bot to spend a lot more time processing audio, some tracks up to 5 times more, causing everyone to hear stutter. By disabling this feature FredBoat can play much more music without lag.\nI recommend setting the bot's volume via the dropdown menu https\://fred.moe/1vD.png +volumeApology=Sorry! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here: volumeSyntax=Use `;;volume <0-150>`. {0}% is the default.\nThe player is currently at **{1}%**. volumeSuccess=Changed volume from **{0}%** to **{1}%**. exportEmpty=Nothing to export, the queue is empty. @@ -129,6 +129,7 @@ luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} second helpSuccess=Documentation has been sent to your direct messages! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled! helpCommandsPromotion=Say {0} to learn what this bot can do! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=No such users brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -214,6 +215,7 @@ commandsModeration=Moderation commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat: @@ -225,6 +227,7 @@ helpProperUsage=Proper usage: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -309,3 +312,19 @@ mathOperationInfinity=The number is too big to be displayed! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/es_ES.properties b/FredBoat/src/main/resources/lang/es_ES.properties index 5a9da4dd2..daae39072 100644 --- a/FredBoat/src/main/resources/lang/es_ES.properties +++ b/FredBoat/src/main/resources/lang/es_ES.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=La cola est\u00e1 vac\u00eda. unpausePlayerNotPaused=El reproductor no est\u00e1 en pausa. unpauseNoUsers=No hay usuarios en el canal de voz. unpauseSuccess=El reproductor est\u00e1 despausado. -volumeApology=\u00a1Lo siento\! El comando ;;volume se encuentra obsoleto en el bot, de m\u00fasica p\u00fablica. Esto provoca que el bot pase mucho mas tiempo procesando el audio, en algunas pistas hasta 5 veces m\u00e1s, haciendo que todos oigan con retraso. Al desactivar esta funci\u00f3n, FredBoat puede reproducir con mucho menos retraso. Recomiendo ajustar el volumen del bot mediante el men\u00fa desplegable https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Uso `;;volume <0-150>`. {0}% es el valor predeterminado.\nEl reproductor est\u00e1 actualmente en **{1}%**. volumeSuccess=Se ha cambiado el volumen de **{0}%** a **{1}%**. exportEmpty=Nada que exportar, la cola est\u00e1 vac\u00eda. @@ -127,6 +127,7 @@ luaTimeout=\ Funci\u00f3n agotada \:anger\: el tiempo de c\u00e1lculo permitido helpSuccess=\u00a1La documentaci\u00f3n te ha sido mandada por mensaje privado\! helpDmFailed=No se pudo enviar la documentaci\u00f3n a las DMs. Por favor comprueba que no los tienes desactivado\! helpCommandsPromotion=\u00a1Di {0} para saber lo que puede hacer este bot\! +musicCommandsPromotion=Dicen que {0} para ver la lista completa de comandos de m\u00fasica. fuzzyNoResults=No existen estos usuarios brainfuckCycleLimit=El programa excedi\u00f3 el n\u00famero m\u00e1ximo de ciclos de {0} brainfuckDataPointerOutOfBounds=Puntero de datos fuera de l\u00edmites\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderaci\u00f3n commandsMaintenance=Mantenimiento commandsBotOwner=Due\u00f1o del bot commandsMoreHelp=Di {0} para obtener m\u00e1s informaci\u00f3n sobre un comando espec\u00edfico. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Comando desconocido. helpDocsLocation=Documentaci\u00f3n se puede contrar en\: helpBotInvite="Quieres agregar FredBoat a tu servidor? Si tienes permisos administrativos en tu servidor, puedes invitar a FredBoat"\: @@ -222,6 +224,7 @@ helpProperUsage=Uso correcto\: helpCommandOwnerRestricted=Este comando se limita al due\u00f1o del bot. helpConfigCommand=Mostrar la configuraci\u00f3n de este servidor o ajustar la configuraci\u00f3n. helpLanguageCommand=Mostrar los idiomas disponibles o configurar un idioma para este servidor. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Banear al usuario y eliminar sus mensajes de los pasados 7 d\u00edas. helpKickCommand=Expulsar a un usuario de este servidor. helpSoftbanCommand=Expulsar a usuario y eliminar sus mensajes de los \u00faltimos 7 d\u00edas. @@ -302,4 +305,20 @@ mathOperationInfinity=\u00a1Este n\u00famero es muy grande para mostrarse\! prefix=Prefijo prefixGuild=El prefijo para el gremio es {0} prefixShowAgain=Usted puede mostrar el prefijo de cualquier momento de nuevo por mencion\u00e1ndome. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=M\u00fasica +moduleModeration=Moderaci\u00f3n +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/et_EE.properties b/FredBoat/src/main/resources/lang/et_EE.properties index b07cfdd26..5a762003e 100644 --- a/FredBoat/src/main/resources/lang/et_EE.properties +++ b/FredBoat/src/main/resources/lang/et_EE.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=J\u00e4rjekord on t\u00fchi. unpausePlayerNotPaused=M\u00e4ngija ei ole peatatud. unpauseNoUsers=Kasutajaid ei ole h\u00e4\u00e4le vestluses. unpauseSuccess=M\u00e4ngija j\u00e4lle m\u00e4ngib n\u00fc\u00fcd. -volumeApology=Vabandust\! ;;h\u00e4\u00e4l k\u00e4sklus on n\u00fc\u00fcd keelatud publikule. Selle p\u00f5hjuseks on see et m\u00e4ngija kulutab palju aega audio t\u00f6\u00f6tlemisel. M\u00f5ned laulud 5 korda rohkem, p\u00f5hjustab k\u00f5iki kuulma kokutamist. Selle funktsiooni v\u00e4lja l\u00fclitamisel FredBoat saab m\u00e4ngida palju rohkem muusikat ilma ooteta. Ma soovitan FredBoati h\u00e4\u00e4lt s\u00e4ttetest muuta via men\u00fc\u00fc https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Kasuta ;;h\u00e4\u00e4l <0-150>. {0}% on tavaline.\nM\u00e4ngija on hetkel **{1}%**. volumeSuccess=Muudetud h\u00e4\u00e4lest **{0}%** h\u00e4\u00e4leks **{1}%**. exportEmpty=Midagi pole eksportida, j\u00e4rjekord on t\u00fchi. @@ -45,21 +45,21 @@ exportPlaylistFail=Ei saanud \u00fcles laadida esitusloendi hastebin.com lehek\u listShowShuffled=N\u00e4itan segatud esitlusloendit. listShowRepeatSingle=Kordan hetkest lugu. listShowRepeatAll=Kordan hetkest j\u00e4rjekorda. -listShowHistory=Showing tracks in history. +listShowHistory=Ajaloos olevate laulude kuvamine. listAddedBy=**{0}** lisatud **{1}** poolt [{2}] listStreamsOnlySingle=Seal on **{0}** laiv {1} j\u00e4rjekorras. listStreamsOnlyMultiple=Seal on **{0}** laiv {1} j\u00e4rjekorras. listStreamsOrTracksSingle=Seal on **{0}** {1} koos \u00fclej\u00e4\u00e4nud pikkusega **[{2}]**{3} j\u00e4rjekorras. -listStreamsOrTracksMultiple=There are **{0}** {1} with a remaining length of **[{2}]**{3} in the queue. +listStreamsOrTracksMultiple=Seal on **{0}** {1} koos \u00fclej\u00e4\u00e4nud pikkusega **[{2}]**{3} j\u00e4rjekorras. streamSingular=Stream streamPlural=streamid listAsWellAsLiveStreams=, as well as **{0}** live {1} -trackSingular=track -trackPlural=tracks -npNotPlaying=Not currently playing anything. -npNotInHistory=Currently no tracks in history. -npDescription=Description -npLoadedSoundcloud=[{0}/{1}]\n\nLoaded from Soundcloud +trackSingular=Lugu +trackPlural=lood +npNotPlaying=Praegu ei m\u00e4ngi midagi. +npNotInHistory=Ajaloos pole lugusid. +npDescription=Kirjeldus +npLoadedSoundcloud=[{0}/{1}] Laaditud Soundcloudi npLoadedBandcamp={0}\n\nLoaded from Bandcamp npLoadedTwitch=Loaded from Twitch permissionMissingBot=I need the following permission to perform that action\: @@ -127,6 +127,7 @@ luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} second helpSuccess=Documentation has been sent to your direct messages\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=Say {0} to learn what this bot can do\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=No such users brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderation commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/fa_IR.properties b/FredBoat/src/main/resources/lang/fa_IR.properties index 2a9fc9828..15c993fa2 100644 --- a/FredBoat/src/main/resources/lang/fa_IR.properties +++ b/FredBoat/src/main/resources/lang/fa_IR.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=\u0644\u06cc\u0633\u062a \u062e\u0627\u0644\u06cc \u0627\u0633 unpausePlayerNotPaused=\u062f\u0633\u062a\u06af\u0627\u0647 \u0645\u062a\u0648\u0642\u0641 \u0646\u0634\u062f\u0647 \u0627\u0633\u062a. unpauseNoUsers=\u0647\u06cc\u0686 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062f\u0631 \u0622\u0646 \u0686\u062a \u0635\u0648\u062a\u06cc \u0646\u06cc\u0633\u062a. unpauseSuccess=\u062f\u0633\u062a\u06af\u0627\u0647 \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0648\u0642\u0641 \u062e\u0627\u0631\u062c \u0634\u062f. -volumeApology=\u0645\u062a\u0627\u0633\u0641\u0645 \! \u0641\u0631\u0645\u0627\u0646 ;;volume \u062f\u0631 \u0639\u0645\u0648\u0645 \u0628\u0627 \u0646\u0627\u0631\u0636\u0627\u06cc\u062a\u06cc \u0645\u0648\u0627\u062c\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0647\u0645\u06cc\u0646 \u0646\u06cc\u0632 \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0648\u062f \u06a9\u0647 \u0631\u0648\u0628\u0627\u062a \u0648\u0642\u062a \u062e\u06cc\u0644\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0648\u06cc \u06a9\u0627\u0631 \u06a9\u0631\u062f\u0646 \u0631\u0648\u06cc \u0635\u062f\u0627\u06cc \u0628\u0627\u062a \u0628\u06af\u0630\u0627\u0631\u062f\u060c \u0628\u0639\u0636\u06cc \u0622\u0647\u0646\u06af \u062d\u062a\u06cc 5 \u0628\u0627\u0631 \u06cc\u0627 \u0628\u06cc\u0634\u062a\u0631\u060c \u06a9\u0647 \u0628\u0627\u0639\u062b \u0645\u06cc\u0634\u0647 \u0647\u0645\u0647 \u0635\u062f\u0627 \u0631\u0648 \u0642\u0637\u0639\u0647 \u0642\u0637\u0639\u0647 \u0628\u0634\u0646\u0648\u0646\u062f. \u0628\u0627 \u063a\u06cc\u0631 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc FredBoat \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0647\u0646\u06af \u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0648 \u0628\u062f\u0648\u0646 lag \u0628\u0634\u0646\u0648\u06cc\u062f. \u0645\u0646 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0645\u06cc\u062f\u0645 \u06a9\u0647 \u0635\u062f\u0627\u06cc \u0631\u0648\u0628\u0627\u062a \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0646\u0648\u06cc https\://fred.moe/1vD.png \u067e\u0627\u06cc\u06cc\u0646 \u0628\u06cc\u0627\u0648\u0631\u06cc\u062f. +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\u0627\u0632 `;;volume <\u06cc\u06a9-150>\u00d7 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u067e\u06cc\u0634 \u0641\u0631\u0636 {0}% \u0627\u0633\u062a.\n\u062f\u0633\u062a\u06af\u0627\u0647 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u062f\u0631 \u062d\u0627\u0644 \u067e\u062e\u0634 \u062f\u0631 **{1}%** \u0627\u0633\u062a. volumeSuccess=\u062d\u062c\u0645 \u0635\u062f\u0627 \u0627\u0632 **{0}%** \u0628\u0647 **{1}%** \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u0627\u0641\u062a. exportEmpty=\u0686\u06cc\u0632\u06cc \u0628\u0631\u0627\u06cc \u067e\u062e\u0634 \u06a9\u0631\u062f\u0646 \u0645\u0648\u062c\u0648\u062f \u0646\u06cc\u0633\u062a\u060c \u0644\u06cc\u0633\u062a \u062e\u0627\u0644\u06cc \u0627\u0633\u062a. @@ -127,6 +127,7 @@ luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} second helpSuccess=Documentation has been sent to your direct messages\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=Say {0} to learn what this bot can do\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=No such users brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=\u0645\u062f\u06cc\u0631\u06cc\u062a commandsMaintenance=\u062a\u0639\u0645\u06cc\u0631\u0627\u062a commandsBotOwner=\u0635\u0627\u062d\u0628 \u0631\u0628\u0627\u062a commandsMoreHelp=\u0628\u0627 \u06af\u0641\u062a\u0646 {0} \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u062f\u0631\u0628\u0627\u0631\u0647 \u06cc\u06a9 \u0641\u0631\u0645\u0627\u0646 \u06a9\u0633\u0628 \u0645\u06cc\u06a9\u0646\u06cc\u062f. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0635\u062d\u06cc\u0 helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/fi_FI.properties b/FredBoat/src/main/resources/lang/fi_FI.properties index 73f78187b..912c0059a 100644 --- a/FredBoat/src/main/resources/lang/fi_FI.properties +++ b/FredBoat/src/main/resources/lang/fi_FI.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=Soittolista on tyhj\u00e4. unpausePlayerNotPaused=Soitin ei ole keskeytetty. unpauseNoUsers=\u00c4\u00e4nikanavalla ei ole k\u00e4ytt\u00e4ji\u00e4. unpauseSuccess=Soitin ei ole en\u00e4\u00e4n keskeytetty. -volumeApology=Olen pahoillani, mutta komento\: ;;volume on poistettu k\u00e4yt\u00f6st\u00e4 julkisella musiikki botilla. T\u00e4m\u00e4 tehtiin, koska se sai soittimen k\u00e4ytt\u00e4m\u00e4\u00e4n paljon enemm\u00e4n aikaa \u00e4\u00e4nen k\u00e4sittelyss\u00e4, jossain kappaleissa jopa viisi kertaa enemm\u00e4n, johtaen siihen, ett\u00e4 kaikki kuulivat \u00e4nkytyst\u00e4 soittimesta. Poistamalla t\u00e4m\u00e4n piirteen k\u00e4yt\u00f6st\u00e4 FredBoat voi nyt soittaa paljon enemm\u00e4n musiikkia ilman viivytyksi\u00e4.\nSuosittelen botin \u00e4\u00e4nenvoimakkuuden s\u00e4\u00e4t\u00e4mist\u00e4 pudotusvalikon kautta https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=K\u00e4yt\u00e4 `;;volume <0-150>`. {0}% on oletusarvo.\nSoitin on t\u00e4ll\u00e4 hetkell\u00e4 **{1}%**. volumeSuccess=\u00c4\u00e4nenvoimakkuus muutettu seuraavasti\: **{0}%** > **{1}%**. exportEmpty=Ei mit\u00e4\u00e4n viet\u00e4v\u00e4\u00e4, odotuslista on tyhj\u00e4. @@ -127,6 +127,7 @@ luaTimeout=Toiminto aikakatkaistiin \:anger\: sallittu laskenta aika on {0} seku helpSuccess=Dokumentaatio on l\u00e4hetetty sinun yksityisviesteihisi\! helpDmFailed=Ei voitu l\u00e4hett\u00e4\u00e4 dokumentaatiota yksityisviesteihisi. Varmista ettei sinulla ole yksityisviestej\u00e4 pois k\u00e4yt\u00f6st\u00e4\! helpCommandsPromotion=Sano {0} oppiaksesi mit\u00e4 t\u00e4m\u00e4 botti osaa tehd\u00e4\! +musicCommandsPromotion=Sano {0} n\u00e4hd\u00e4ksesi t\u00e4yden listan musiikkikomennoista. fuzzyNoResults=Kyseisi\u00e4 k\u00e4ytt\u00e4ji\u00e4 ei ole brainfuckCycleLimit=Ohjelma ylitti syklien enimm\u00e4ism\u00e4\u00e4r\u00e4n joka on {0} brainfuckDataPointerOutOfBounds=Tietojen osoitin on rajojensa ulkopuolella\: {0} @@ -211,6 +212,7 @@ commandsModeration=Yll\u00e4pito commandsMaintenance=Huolto commandsBotOwner=Botin omistaja commandsMoreHelp=Sano {0} saadaksesi lis\u00e4tietoa tietyst\u00e4 komennosta. +commandsModulesHint=Voit ottaa k\u00e4ytt\u00f6\u00f6n ja pois k\u00e4yt\u00f6st\u00e4 lis\u00e4moduuleja k\u00e4ytt\u00e4en {0} helpUnknownCommand=Tuntematon komento. helpDocsLocation=Dokumentit l\u00f6yt\u00e4\u00e4\: helpBotInvite=Haluatko lis\u00e4t\u00e4 FredBoatin serverillesi? Jos sinulla on Serverin Muutto oikeudet, voit lis\u00e4t\u00e4 FredBoatin\: @@ -222,6 +224,7 @@ helpProperUsage=Asianmukainen k\u00e4ytt\u00f6\: helpCommandOwnerRestricted=T\u00e4m\u00e4 komento on rajoitettu vain botin omistajalle. helpConfigCommand=N\u00e4yt\u00e4 t\u00e4m\u00e4n killan asetukset tai s\u00e4\u00e4d\u00e4 asetuksia. helpLanguageCommand=N\u00e4yt\u00e4 k\u00e4ytett\u00e4viss\u00e4 olevat kielet tai m\u00e4\u00e4rit\u00e4 t\u00e4lle killalle kieli. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Anna porttikielto k\u00e4ytt\u00e4j\u00e4lle ja poista h\u00e4nen viestins\u00e4 viimeisten seitsem\u00e4n p\u00e4iv\u00e4n ajalta. helpKickCommand=Potki k\u00e4ytt\u00e4j\u00e4 ulos t\u00e4st\u00e4 killasta. helpSoftbanCommand=Anna k\u00e4ytt\u00e4j\u00e4lle softb\u00e4nni potkimalla h\u00e4net ulos ja poistamalla h\u00e4nen viestins\u00e4 viimeisten seitsem\u00e4n p\u00e4iv\u00e4n ajalta. @@ -302,4 +305,20 @@ mathOperationInfinity=Numero on liian iso n\u00e4ytett\u00e4v\u00e4ksi\! prefix=Etuliite prefixGuild=T\u00e4m\u00e4n ryhm\u00e4n etuliite on {0} prefixShowAgain=Voit n\u00e4ytt\u00e4\u00e4 etuliitteen aina, mainitsemalla minut. +moduleAdmin=Yll\u00e4pito +moduleInfo=Tiedot +moduleConfig=Asetukset +moduleMusic=Musiikki +moduleModeration=Moderointi +moduleUtility=Hy\u00f6dykkeet +moduleFun=Hauskaa +moduleLocked=Moduuli {0} on lukittu eik\u00e4 sit\u00e4 voi ottaa k\u00e4ytt\u00f6\u00f6n/pois k\u00e4yt\u00f6st\u00e4. +moduleCantParse=Kyseist\u00e4 moduulia ei ole olemassa. N\u00e4et t\u00e4yden listan saatavilla olevista moduuleista k\u00e4ytt\u00e4en {0} +moduleStatus=Moduulin tila +moduleDisable=Moduuli {0} otettiin pois k\u00e4yt\u00f6st\u00e4. +moduleEnable=Moduuli {0} otettiin k\u00e4ytt\u00f6\u00f6n. +moduleShowCommands=Sano {0} n\u00e4hd\u00e4ksesi t\u00e4m\u00e4n moduulin komennot. +modulesCommands=Sano {0} n\u00e4hd\u00e4ksesi t\u00e4m\u00e4n moduulin komennot tai {1} n\u00e4hd\u00e4ksesi kaikki komennot. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Sano {0} ottaaksesi moduuleita k\u00e4ytt\u00f6\u00f6n/pois k\u00e4yt\u00f6st\u00e4. diff --git a/FredBoat/src/main/resources/lang/fil_PH.properties b/FredBoat/src/main/resources/lang/fil_PH.properties index 2298dbde3..c32051e2e 100644 --- a/FredBoat/src/main/resources/lang/fil_PH.properties +++ b/FredBoat/src/main/resources/lang/fil_PH.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=Walang nakalagay sa listahan. unpausePlayerNotPaused=Ang player ay hindi naka hinto. unpauseNoUsers=Walang user sa loob ng voice chat. unpauseSuccess=Ang player ay hindi na naka hinto. -volumeApology=Paumanhin\! pero ang ;;volume command ay hindi na ginagamit sa publikang music bot. Dahil sa kadahilanang ang bot ay nag uubos ng maraming oras para procesohin ang audio, at ang ibang track mas matagal ng 5 beses, kadahilanang makarinig ang lahat ng stutter. Sa pag disable ng feature na ito si FredBoat ay maaaring makapag play ng kanta ng walang lag. \nHinihikayat ko kayong gamitin ito para baguhin ang volume ng bot \nhttps\://fred.moe.1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Paggamit `;;volume <0-150>`. {0}% ay ang normal.\nAng player ay kasalukuyang nasa **{1}%**. volumeSuccess=Nagbago ang lakas na galing sa **{0}%** na ngayon ay **{1}%**. exportEmpty=Walang ma i-export, ang listahan ay walang laman. @@ -127,6 +127,7 @@ luaTimeout=\ Nag-time out ang function \:anger\: Ang pinahintulutuang computatio helpSuccess=Ang dokumentasyon ay ipinadala direkta sa inyong mensahe\! helpDmFailed=Maaaring hindi kayang magpadala ng dokumentasyon sa inyong DMs. Pakiusap pakitignan na wala sa kanilang may kapansanan\! helpCommandsPromotion=Sabihin {0} para malaman kung anong kayang gawin ng bot na ito\! +musicCommandsPromotion=Sabihin {0} upang makita ang isang kumpletong listahan ng mga utos ng musika. fuzzyNoResults=Walang ganitong mga gumagamit brainfuckCycleLimit=Ang programa ay lumagpas sa pinakamataas na siklo ng pagbibilang {0} brainfuckDataPointerOutOfBounds=Ang panturo ng datos ay lumabas sa mga hanggan\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderasyon commandsMaintenance=Pagpapanatili commandsBotOwner=May-ari ng bot commandsMoreHelp=Sabihin na {0} kumuha ng maraming impormasyon sa partikular na pindutan. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Di-matukoy na pindutan. helpDocsLocation=Ang dokumento ay matatagpuan sa\: helpBotInvite=Gusto mong bang magdagdag ng FredBoat sa iyong serber? Kung pinapangasiwaan mo ang pahintulot ng seber para sa iyong guild, Maaaring mong maimbita ang FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Wastong paggamit\: helpCommandOwnerRestricted=Ang pindutan na ito ay takda ng may ari ng mga bot. helpConfigCommand=Ipakita ang kumpig ng guild na ito o kaya ay ayosin ang mga setings. helpLanguageCommand=Ipakita ang mga wikang pwede or magtakda ng mga wika sa guild na ito. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Pagbawalan ang gumagami na burahin ang mga mensahe sa nakalipas na pitong araw. helpKickCommand=Patalsikin ang mga gumgamit sa guild na ito. helpSoftbanCommand=Pansamantalang pagbabawal sa mga gumagamit na pagsipa sa kanya at pagbubura ng mga mensahe mula sa nakalipas na pitong 7 araw. @@ -264,11 +267,11 @@ helpPerms=Payagan ang mga miyembro ng putinglistahan at gampanan para sa {0} ran helpPrefixCommand=Itakda ang unlapit para sa guild na ito. helpVoteSkip=Bumoto para malaktawan ang kasalukuyang awitin. Kailangan ang 50% ng lahat ng gumagamit ng tinig sa usapan upang bumoto. helpMathOperationAdd=I-print ang kabuuan ng num1 at num2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. +helpMathOperationSub=I-print ang pagkakaiba ng pagbawas ng num2 mula sa num1. +helpMathOperationMult=I-print ang produkto ng num1 * num2. +helpMathOperationDiv=I-print ang kusyente ng paghahati ng num1 by num2. +helpMathOperationMod=I-print ang natitira sa paghahati ng num1 sa pamamagitan ng num2. +helpMathOperationPerc=I-print ang porsyento na kinakatawan ng num1 sa num2. helpMathOperationSqrt=Print the square root of num. helpMathOperationPow=Print the result of num1^num2. destroyDenied=You must have the manage messages permission to reset the player. @@ -302,4 +305,20 @@ mathOperationInfinity=Ang bilang ay masyadong malaki para maipakita\! prefix=Unlapi prefixGuild=Ang unlapi para sa guild na ito ay {0} prefixShowAgain=Muli maaaring mong maipakita ang unlapi anomang oras sa pamamagitan ng pagbanggit sakin. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/fr_FR.properties b/FredBoat/src/main/resources/lang/fr_FR.properties index 3142d4a7e..8cdd22967 100644 --- a/FredBoat/src/main/resources/lang/fr_FR.properties +++ b/FredBoat/src/main/resources/lang/fr_FR.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=La file d\u2019attente est vide. unpausePlayerNotPaused=Le lecteur n'est pas en pause. unpauseNoUsers=Il n'y a aucun utilisateur dans le canal vocal. unpauseSuccess=Le lecteur a repris sa lecture. -volumeApology=D\u00e9sol\u00e9 \! La commande ;;volume est d\u00e9sactiv\u00e9e pour les bots de musique publics. Le bot d\u00e9pense beaucoup plus de temps \u00e0 g\u00e9rer l'audio, jusqu'\u00e0 5 fois la puissance n\u00e9cessaire pour d'autres pistes, entra\u00eenant tout le monde \u00e0 l'entendre b\u00e9gayer. En d\u00e9sactivant cette fonction, FredBoat peut jouer beaucoup plus de pistes sans lag.\nJe recommande r\u00e9gler le volume du bot par l\u2019interm\u00e9diaire du menu clic droit sur le pseudo https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Utilisez `;;volume <0-150>`. {0}% est la valeur par d\u00e9faut. Le lecteur est actuellement \u00e0 **{1} %**. volumeSuccess=Volume chang\u00e9 **%{0}** \u00e0 **{1}%**. exportEmpty=Rien \u00e0 exporter, la file d\u2019attente est vide. @@ -127,6 +127,7 @@ luaTimeout=\ Fonction timout \:anger\: Le temps autoris\u00e9 est de {0} seconde helpSuccess=La documentation a \u00e9t\u00e9 envoy\u00e9e dans votre messagerie priv\u00e9e\! helpDmFailed=Impossible de vous envoyer la documentation en MP. V\u00e9rifiez que vous ne les avez pas d\u00e9sactiv\u00e9s \! helpCommandsPromotion=Dites {0} pour savoir ce que ce bot peut faire \! +musicCommandsPromotion=Dites {0} pour voir une liste compl\u00e8te des commandes de musique. fuzzyNoResults=Aucun utilisateur brainfuckCycleLimit=Le programme a d\u00e9pass\u00e9 le nombre maximum de cycles, qui est de {0} brainfuckDataPointerOutOfBounds=Pointeur de donn\u00e9es hors limites\u00a0\: {0} @@ -211,6 +212,7 @@ commandsModeration=Mod\u00e9ration commandsMaintenance=Maintenance commandsBotOwner=Propri\u00e9taire du bot commandsMoreHelp=Dites {0} pour obtenir plus d\u2019informations sur une commande sp\u00e9cifique. +commandsModulesHint=Vous pouvez activer et d\u00e9sactiver des modules suppl\u00e9mentaires avec {0} helpUnknownCommand=Commande inconnue. helpDocsLocation=La documentation peut \u00eatre trouv\u00e9e ici \: helpBotInvite=Vous voulez ajouter FredBoat \u00e0 votre serveur ? Si vous avez la permission de g\u00e9rer cette guilde, vous pouvez inviter FredBoat \: @@ -222,6 +224,7 @@ helpProperUsage=Utilisation ad\u00e9quate \: helpCommandOwnerRestricted=Cette commande est r\u00e9serv\u00e9e au propri\u00e9taire du bot. helpConfigCommand=Affiche la configuration de cette guilde ou ajuste les param\u00e8tres. helpLanguageCommand=Affiche les langues disponibles ou d\u00e9finit une langue pour cette guilde. +helpModules=Affiche, active ou d\u00e9sactive les modules de commande pour cette guilde. helpHardbanCommand=Banni un utilisateur et supprime les messages jusqu'\u00e0 7 jours auparavant. helpKickCommand=Exclu un utilisateur de cette guilde. helpSoftbanCommand=Exclu temporairement un utilisateur en l'expulsant et en supprimant ses messages depuis les 7 derniers jours. @@ -302,4 +305,20 @@ mathOperationInfinity=Le nombre est trop grand pour \u00eatre affich\u00e9 \! prefix=Pr\u00e9fixe prefixGuild=Le pr\u00e9fixe pour cette guilde est {0} prefixShowAgain=Vous pouvez montrer le pr\u00e9fixe quand vous le voulez en me mentionnant. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Musique +moduleModeration=Mod\u00e9ration +moduleUtility=Utilitaire +moduleFun=Fun +moduleLocked=Le module {0} est verrouill\u00e9 et ne peut pas \u00eatre activ\u00e9/d\u00e9sactiv\u00e9. +moduleCantParse=Aucun module. Affichez une liste des modules disponibles avec {0} +moduleStatus=Status du module +moduleDisable=Le module {0} est d\u00e9sactiv\u00e9. +moduleEnable=Le module {0} est activ\u00e9. +moduleShowCommands=Dites {0} pour voir les commandes de ce module. +modulesCommands=Dites {0} pour afficher les commandes d''un module, ou {1} pour afficher toutes les commandes. +modulesEnabledInGuild=Modules activ\u00e9s pour cette guilde \: +modulesHowTo=Dites {0} pour activer/d\u00e9sactiver des modules. diff --git a/FredBoat/src/main/resources/lang/he_IL.properties b/FredBoat/src/main/resources/lang/he_IL.properties index e2b5ad103..7ed993a19 100644 --- a/FredBoat/src/main/resources/lang/he_IL.properties +++ b/FredBoat/src/main/resources/lang/he_IL.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=\u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05e9\u05de\u05e2 \u05e8 unpausePlayerNotPaused=\u05d4\u05e0\u05d2\u05df \u05d0\u05d9\u05e0\u05d5 \u05d1\u05d4\u05e9\u05d4\u05d9\u05d4. unpauseNoUsers=\u05d0\u05d9\u05df \u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d1\u05e6'\u05d0\u05d8 \u05d4\u05e7\u05d5\u05dc\u05d9. unpauseSuccess=\u05d4\u05e0\u05d2\u05df \u05e2\u05db\u05e9\u05d9\u05d5 \u05d0\u05d9\u05e0\u05d5 \u05d1\u05d4\u05e9\u05d4\u05d9\u05d4. -volumeApology=\u05de\u05e6\u05d8\u05e2\u05e8\! \u05d4\u05e4\u05e7\u05d5\u05d3\u05d4 ;;volume \u05d4\u05d5\u05e1\u05e8\u05d4 \u05de\u05d1\u05d5\u05d8 \u05d4\u05de\u05d5\u05e1\u05d9\u05e7\u05d4 \u05d4\u05e6\u05d9\u05d1\u05d5\u05e8\u05d9. \u05d6\u05d4 \u05d1\u05e9\u05dc \u05db\u05da \u05e9\u05d4\u05e4\u05e7\u05d5\u05d3\u05d4 \u05d2\u05d5\u05e8\u05de\u05ea \u05dc\u05d1\u05d5\u05d8 \u05dc\u05d1\u05d6\u05d1\u05d6 \u05d9\u05d5\u05ea\u05e8 \u05d6\u05de\u05df \u05e2\u05dc \u05e2\u05d9\u05d1\u05d5\u05d3 \u05d4\u05e9\u05de\u05e2, \u05d1\u05d7\u05dc\u05e7 \u05de\u05d4\u05e9\u05d9\u05e8\u05d9\u05dd \u05e2\u05d3 \u05dc\u05e4\u05d9 5 \u05de\u05d4\u05d6\u05de\u05df \u05d4\u05e8\u05d2\u05d9\u05dc, \u05d5\u05d6\u05d4 \u05d2\u05d5\u05e8\u05dd \u05dc\u05db\u05d5\u05dc\u05dd \u05dc\u05e9\u05de\u05d5\u05e2 \u05e7\u05d8\u05d9\u05e2\u05d5\u05ea. \u05d1\u05db\u05da \u05e9\u05e4\u05e7\u05d5\u05d3\u05d4 \u05d6\u05d5 \u05d4\u05d5\u05e1\u05e8\u05d4, \u05e4\u05e8\u05d3\u05d1\u05d5\u05d8 \u05d9\u05db\u05d5\u05dc \u05dc\u05e0\u05d2\u05df \u05d9\u05d5\u05ea\u05e8 \u05de\u05d5\u05d6\u05d9\u05e7\u05d4 \u05dc\u05dc\u05d0 \u05e2\u05d9\u05db\u05d5\u05d1\u05d9\u05dd. \n\u05d0\u05e0\u05d9 \u05de\u05de\u05dc\u05d9\u05e5 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05e2\u05d5\u05e6\u05de\u05ea \u05d4\u05e7\u05d5\u05dc \u05e9\u05dc \u05d4\u05d1\u05d5\u05d8 \u05d1\u05e2\u05d6\u05e8\u05ea \u05ea\u05e4\u05e8\u05d9\u05d8 \u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\u05e9\u05d9\u05de\u05d5\u05e9 ''; \u05e0\u05e4\u05d7 <0-150> ". %{0} \u05d4\u05d5\u05d0 \u05d1\u05e8\u05d9\u05e8\u05ea \u05d4\u05de\u05d7\u05d3\u05dc. \u05d4\u05e0\u05d2\u05df \u05e4\u05d5\u05e2\u05dc \u05db\u05e8\u05d2\u05e2 \u05d1 * *{1}% * *. volumeSuccess=\u05d5\u05d5\u05dc\u05d9\u05d5\u05dd \u05e9\u05d5\u05e0\u05d4 \u05de- **{0}%** \u05dc- **{1}%**. exportEmpty=\u05d0\u05d9\u05df \u05de\u05d4 \u05dc\u05d9\u05d9\u05e6\u05d0, \u05d4\u05ea\u05d5\u05e8 \u05e8\u05d9\u05e7. @@ -62,15 +62,15 @@ npDescription=\u05ea\u05d9\u05d0\u05d5\u05e8 npLoadedSoundcloud=[{0}/{1}]\n\n\u05e0\u05d8\u05e2\u05df \u05de\u05e1\u05d0\u05d5\u05e0\u05d3\u05e7\u05dc\u05d0\u05d5\u05d3 npLoadedBandcamp={0} \u05e0\u05d8\u05e2\u05df \u05de\u05d1\u05d0\u05e0\u05d3\u05e7\u05d0\u05de\u05e4 npLoadedTwitch=\u05e0\u05d8\u05e2\u05df \u05de\u05d8\u05d5\u05d5\u05d9\u05e5' -permissionMissingBot=I need the following permission to perform that action\: -permissionEmbedLinks=Embed Links +permissionMissingBot=\u05d0\u05e0\u05d9 \u05e6\u05e8\u05d9\u05da \u05d0\u05ea \u05d4\u05e7\u05d9\u05e9\u05d5\u05e8\u05d9\u05dd \u05d4\u05d1\u05d0\u05d9\u05dd \u05db\u05d3\u05d9 \u05dc\u05d1\u05e6\u05e2 \u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5\: +permissionEmbedLinks=\u05dc\u05e4\u05e8\u05e1\u05dd \u05e7\u05d9\u05e9\u05d5\u05e8\u05d9\u05dd rating=\u05d3\u05d9\u05e8\u05d5\u05d2 listeners=\u05de\u05d0\u05d6\u05d9\u05e0\u05d9\u05dd year=\u05e9\u05e0\u05d4 album=\u05d0\u05dc\u05d1\u05d5\u05dd artist=\u05d6\u05de\u05e8 circle=\u05de\u05e2\u05d2\u05dc -npLoadedFromHTTP={0}\n\nLoaded from {1} +npLoadedFromHTTP={0} \u05e0\u05d8\u05e2\u05df \u05de\u05ea\u05d5\u05da {1} npLoadedDefault={0}\n\nLoaded from {1} noneYet=\u05d0\u05d9\u05df \u05db\u05e8\u05d2\u05e2 npRatingRange={0}/5 from {1} vote(s) @@ -91,7 +91,7 @@ loadErrorCommon=Error occurred when loading info for `{0}`\:\n{1} loadErrorSusp=Suspicious error when loading info for `{0}`. loadQueueTrackLimit=You can''t add tracks to a queue with more than {0} tracks\! This is to prevent abuse. loadAnnouncePlaylist=About to load playlist **{0}** with up to `{1}` tracks. This may take a while, please be patient. -playerUserNotInChannel=You must join a voice channel first. +playerUserNotInChannel=\u05e2\u05dc\u05d9\u05da \u05dc\u05d4\u05d9\u05db\u05e0\u05e1 \u05dc\u05e2\u05e8\u05d5\u05e5 \u05e7\u05d5\u05dc\u05d9 \u05e7\u05d5\u05d3\u05dd. playerJoinConnectDenied=I am not permitted to connect to that voice channel. playerJoinSpeakDenied=\u05d0\u05e0\u05d9 \u05dc\u05d0 \u05de\u05d5\u05e8\u05e9\u05d4 \u05dc\u05d4\u05e9\u05de\u05d9\u05e2 \u05de\u05d5\u05d6\u05d9\u05e7\u05d4 \u05d1\u05e2\u05e8\u05d5\u05e5 \u05d4\u05e7\u05d5\u05dc \u05d4\u05d6\u05d4. playerNotInChannel=Not currently in a channel. @@ -115,11 +115,11 @@ malScore={0}**\u05d3\u05d9\u05e8\u05d5\u05d2\:**{1}\n malType={0}**Type\: **{1}\n malStatus={0}**Status\: **{1}\n malStartDate={0}**Start date\: **{1}\n -malEndDate={0}**End date\: **{1} +malEndDate={0}**\u05ea\u05d0\u05e8\u05d9\u05da \u05e1\u05d5\u05e4\u05d9\: **{1} malSynopsis={0}**Synopsis\: **"{1}"\n malUserReveal={0}\: Search revealed a user.\n malNoResults={0}\: No results. -malUserName={0}**Name\: **{1}\n +malUserName={0}**\u05e9\u05dd\: **{1}\n malUrl={0}**URL\: **{1}\n luaError=\ A Lua error occured \:anger\:\n```{0}``` luaErrorOutputTooBig=\ Output buffer is too large \:anger\: Discord only allows 2000 characters per message, got {0} @@ -127,6 +127,7 @@ luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} second helpSuccess=Documentation has been sent to your direct messages\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=Say {0} to learn what this bot can do\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=No such users brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderation commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/hr_HR.properties b/FredBoat/src/main/resources/lang/hr_HR.properties index b8e1b56c7..19cde8ac0 100644 --- a/FredBoat/src/main/resources/lang/hr_HR.properties +++ b/FredBoat/src/main/resources/lang/hr_HR.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=Redslijed reprodukcije je prazan. unpausePlayerNotPaused=Glazbeni svira\u010d nije pauziran. unpauseNoUsers=Nema korisnika u glasovnim kanalima. unpauseSuccess=Glazbeni svira\u010d je odpauzirao. -volumeApology=Isprike, naredba ;;volume je trenutno onemogu\u0107ena na javnom glazbenom botu. Zbog ove naredbe bot provodi previ\u0161e vremena obra\u0111ivaju\u0107i zvuk \u0161to uzrokuje zastajkivanje reprodukcije. Onemogu\u0107ivanjem ove naredbe, FredBoat mo\u017ee reproducirati glazbu bez ikakvih zaka\u0161njenja i zastajkivanja. Preporu\u010dujem namje\u0161tanje glasno\u0107e bota pomo\u0107u izbornika kojem pristupate desnim klikom na bota dok se nalazi u glasovnom kanalu. https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Koristi `;;volume <0-150>`. {0}% je zadana vrijednost.\nGlasno\u0107a svira\u010da je trenutno na **{1}%**. volumeSuccess=Glasno\u0107a je promjenjena sa **{0}%** na **{1}%**. exportEmpty=Nema ni\u010dega za izvoz redoslijeda, redoslijed je prazan. @@ -127,6 +127,7 @@ luaTimeout=\ Funkcija istekla \:anger\: dozvoljeno vrijeme procesuiranja je {0} helpSuccess=Upute su poslane u va\u0161 sandu\u010di\u0107 s porukama\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=Reci {0} da biste saznali \u0161to mo\u017eete u\u010diniti ovaj bot\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Nema takvih korisnika brainfuckCycleLimit=Program je prema\u0161io maksimalni broj ciklusa koji je {0} brainfuckDataPointerOutOfBounds=Pokaziva\u010d podataka van granice\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderiranje commandsMaintenance=Odr\u017eavanje commandsBotOwner=Vlasnik bota commandsMoreHelp=Napi\u0161ite {0} da biste dobili vi\u0161e informacija o odre\u0111enoj naredbi. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Pravilno kori\u0161tenje\: helpCommandOwnerRestricted=Ova naredba je ograni\u010dena na vlasnika bota. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -294,12 +297,28 @@ voteSkipAdded=Your vote has been added\! voteSkipAlreadyVoted=You already voted to skip this track\! voteSkipSkipping={0} have voted to skip. Skipping track {1}. voteSkipNotEnough={0} have voted to skip. At least {1} needed. -voteSkipEmbedNoVotes=No votes to skip this track yet. +voteSkipEmbedNoVotes=Nema glasova za presko\u010diti ovu pjesmu jo\u0161. voteSkipEmbedVoters={0} out of {1} have voted to skip the current track -mathOperationResult=The result is -mathOperationDivisionByZeroError=I cannot divide by zero. -mathOperationInfinity=The number is too big to be displayed\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} +mathOperationResult=Rezultat je +mathOperationDivisionByZeroError=Ja nemogu dijeliti s nulom. +mathOperationInfinity=Broj je preveliki da bi se mogao prikazati\! +prefix=Prefiks +prefixGuild=Prefix ovog guilda je {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administracija +moduleInfo=Informacije +moduleConfig=Konfiguracija +moduleMusic=Glazba +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Zabava +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/hu_HU.properties b/FredBoat/src/main/resources/lang/hu_HU.properties index 2279835ce..9c038e2c3 100644 --- a/FredBoat/src/main/resources/lang/hu_HU.properties +++ b/FredBoat/src/main/resources/lang/hu_HU.properties @@ -1,112 +1,112 @@ #X-Generator: crowdin.com -playQueueEmpty=A lej\u00e1tsz\u00f3 most \u00e9ppen nem j\u00e1tsz zen\u00e9t. Haszn\u00e1ld ezt a parancsot hogy adj hozz\u00e1 zen\u00e9t\: \n;;play +playQueueEmpty=A lej\u00e1tsz\u00f3 most \u00e9ppen nem j\u00e1tszik semmit. Haszn\u00e1ld a k\u00f6vetkez\u0151 form\u00e1t zene hozz\u00e1ad\u00e1s\u00e1hoz\:\n;;play playAlreadyPlaying=A lej\u00e1tsz\u00f3 m\u00e1r megy. -playVCEmpty=Nincsenek felhaszn\u00e1l\u00f3k a voice chat-en. -playWillNowPlay=A lej\u00e1tsz\u00f3 most menni fog. +playVCEmpty=Nincsenek felhaszn\u00e1l\u00f3k a szob\u00e1ban\! +playWillNowPlay=A lej\u00e1tsz\u00f3 elindult. playSearching=Keres\u00e9s a YouTube-on erre `{q}`... -playYoutubeSearchError=Hiba t\u00f6rt\u00e9nt a YouTube-on keres\u00e9s k\u00f6zbe. Pr\u00f3b\u00e1lj meg linket beirn\u00ed ink\u00e1bb.\n```\n;;play ``` +playYoutubeSearchError=Hiba t\u00f6rt\u00e9nt a YouTube-on keres\u00e9s k\u00f6zben. Fontold meg ink\u00e1bb a k\u00f6zvetlen link haszn\u00e1lat\u00e1t a hang forr\u00e1s\u00e1hoz.\n```\n;;play ``` playSearchNoResults=Nincsen tal\u00e1lat erre `{q}` -playSelectVideo=**K\u00e9rlek v\u00e1lasz zen\u00e9t ezzel a `{0}play n` parancsal\:** -joinJoining=Csatlakoz\u00e1s {0} -joinErrorAlreadyJoining=Hiba t\u00f6rt\u00e9nt. Nem lehet csatlakozni {0} mert m\u00e1r pr\u00f3b\u00e1lok csatlakozni. K\u00e9rlek pr\u00f3b\u00e1ld \u00fajra. -pauseAlreadyPaused=A lej\u00e1tsz\u00f3 m\u00e1r le van \u00e1ll\u00edtva. -pauseSuccess=A lej\u00e1tsz\u00f3 le van \u00e1llitva. El tudod ind\u00edtani ezzel `{0}unpause`. +playSelectVideo=**K\u00e9rlek v\u00e1lasz zen\u00e9t a `{0}play 1-5` paranccsal\:** +joinJoining=Csatlakoz\u00e1s {0} szob\u00e1ba +joinErrorAlreadyJoining=Egy hiba t\u00f6rt\u00e9nt. Nem tudok csatlakozni {0} szob\u00e1ba, mert m\u00e1r pr\u00f3b\u00e1lok csatlakozni oda. K\u00e9rlek pr\u00f3b\u00e1ld \u00fajra k\u00e9s\u0151bb. +pauseAlreadyPaused=A lej\u00e1tsz\u00f3 m\u00e1r sz\u00fcneteltetve van. +pauseSuccess=A lej\u00e1tsz\u00f3 most sz\u00fcnetel. Folytathatod a lej\u00e1tsz\u00e1st a `{0}unpause` paranccsal. repeatOnSingle=A lej\u00e1tsz\u00f3 ism\u00e9telni fogja ezt a zen\u00e9t. repeatOnAll=A lej\u00e1tsz\u00f3 ism\u00e9telni fogja ezt a list\u00e1t. -repeatOff=A lej\u00e1tsz\u00f3 nem fog t\u0151bb\u00e9 ism\u00e9telni. -selectSuccess=Zene **\#{0}** ki lett v\u00e1lasztva\: **{1}** ({2}) -selectInterval=Musz\u00e1j egy sz\u00e1mnak lennie 1-{0}. -selectSelectionNotGiven=El\u00f6sz\u00f6r ki kell v\u00e1lasztanod hova akarod. -shuffleOn=A lej\u00e1tsz\u00f3 most megy. -shuffleOff=A lej\u00e1tsz\u00f3 nem megy. -reshufflePlaylist=Lista megy. -reshufflePlayerNotShuffling=El\u00f6sz\u00f6r kapszold be a random m\u00f3dot. +repeatOff=Ism\u00e9tl\u00e9s kikapcsolva. +selectSuccess=**\#{0}** kiv\u00e1lasztva\: **{1}** ({2}) +selectInterval=A sz\u00e1mnak 1 \u00e9s {0} k\u00f6z\u00f6tt kell lennie. +selectSelectionNotGiven=You must first be given a selection to choose from. +shuffleOn=A lej\u00e1tsz\u00e1si lista megkeverve. +shuffleOff=A lej\u00e1tsz\u00e1si lista mostant\u00f3l nincs megkeverve. +reshufflePlaylist=Lista \u00fajrakeverve. +reshufflePlayerNotShuffling=El\u0151bb enged\u00e9lyezned kell a kevert m\u00f3dot. skipEmpty=A lista \u00fcres\! -skipOutOfBounds=Nem tudod elt\u00e1vol\u00edtani ezt a zene sz\u00e1mot {0} mikor itt csak {1} zene van. -skipNumberTooLow=A megadott sz\u00e1mnak t\u00f6bbnek kell lennie 0 n\u00e1l. -skipSuccess=\u00daj zene \#{0}\: **{1}** -skipRangeInvalid=A kiv\u00e1lasztott zene hossz\u00fas\u00e1ga nem enged\u00e9lyezett. -skipRangeSuccess=A zene \#{0} a \#{1} t\u00f6r\u00f6lve lett. -skipTrackNotFound=Nem lehet zen\u00e9t tal\u00e1lni \u00e1tugr\u00e1sra. -stopAlreadyEmpty=A lista m\u00e1r \u00fcres. -stopEmptyOne=A lista \u00fcres lett mert `1` zene t\u00f6r\u00f6lve lett. +skipOutOfBounds=Nem tudom elt\u00e1vol\u00edtani a {0}. sz\u00e1mot, mert csak {1} sz\u00e1m van. +skipNumberTooLow=A megadott sz\u00e1mnak nagyobbnak kell lennie 0-n\u00e1l. +skipSuccess=\#{0}. sz\u00e1m \u00e1tugorva\: **{1}** +skipRangeInvalid=A kiv\u00e1lasztott tartom\u00e1ny nem megfelel\u0151. +skipRangeSuccess=A zene \#{0}-t\u00f3l \#{1}-ig t\u00f6r\u00f6lve lett. +skipTrackNotFound=Nem tal\u00e1lok \u00e1tugorni val\u00f3 sz\u00e1mot. +stopAlreadyEmpty=A lej\u00e1tsz\u00e1si lista m\u00e1r \u00fcres. +stopEmptyOne=A lej\u00e1tsz\u00e1si lista \u00fcr\u00edtve, `1`\u02d9sz\u00e1m t\u00f6r\u00f6lve. stopEmptySeveral=A lista \u00fcr\u00edtve lett, `{0}` zene t\u00f6r\u00f6lve lett. -stopAccessDenied=Ez az \u00fczenet csak azoknak megy akik \u00fczenetet tudnak v\u00e1ltoztatni. +stopAccessDenied=A vissza\u00e9l\u00e9sek elker\u00fcl\u00e9se \u00e9rdek\u00e9ben ezt a parancsot csak azok tudj\u00e1k haszn\u00e1lni, akik tudj\u00e1k az \u00fczeneteket kezelni. unpauseQueueEmpty=A lista \u00fcres. -unpausePlayerNotPaused=A lej\u00e1tsz\u00f3 nem le\u00e1ll\u00edtott. +unpausePlayerNotPaused=A lej\u00e1tsz\u00f3 nem sz\u00fcnetel. unpauseNoUsers=Nincsenek felhaszn\u00e1l\u00f3k a voice chat-en. -unpauseSuccess=A lej\u00e1tsz\u00f3 most elindult. -volumeApology=Bocsi\! A ;;volume parancs le\u00e1llt a publikus bot-on. Ez az\u00e9rt t\u00f6rt\u00e9nt mert id\u0151 kell a hang feldolgoz\u00e1s\u00e1ra, egy p\u00e1r sz\u00e1mn\u00e1l ak\u00e1r \u00f6tsz\u00f6r t\u00f6bb ideig, hang akad\u00e1s\u00e1t okozva mindenkin\u00e9l. Ennek a funkci\u00f3nak a kikapcsol\u00e1s\u00e1val t\u00f6bb zen\u00e9t tudsz j\u00e1tszani kevesebb lagg-al. Aj\u00e1nlom a bot hang erej\u00e9nek a be\u00e1ll\u00edt\u00e1s\u00e1t a dropdown men\u00fc-n\u00e9l https\://fred.moe/1vD.png -volumeSyntax=Haszn\u00e1ld a `;;volume <0-150>`. {0}% az alap. A lej\u00e1tsz\u00f3 most **{1}%** n\u00e1l van. -volumeSuccess=A hanger\u00f6t **{0}%** r\u00f3l **{1}%** ra v\u00e1ltoztattad. -exportEmpty=Semmi sincs hogy kibontsad, a lista \u00fcres. -exportPlaylistResulted=Kibontottad a lej\u00e1tsz\u00e1si list\u00e1t\: {0}\nMost tudsz URL-t hozz\u00e1 adni a lej\u00e1tsz\u00e1si list\u00e1hoz k\u00e9s\u00f6bb. -exportPlaylistFail=Hiba a lej\u00e1tsz\u00e1si lista felt\u00f6lt\u00e9s\u00e9n\u00e9l a hastebin.com ra +unpauseSuccess=Lej\u00e1tsz\u00e1s folytat\u00e1sa. +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: +volumeSyntax=Haszn\u00e1ld a `;;volume <0-150>` parancsot. {0}% az alap\u00e9rtelmezett. \nA lej\u00e1tsz\u00f3 most **{1}%**-on van. +volumeSuccess=Hanger\u0151 \u00e1t\u00e1ll\u00edtva **{0}%**-r\u00f3l **{1}%**-ra. +exportEmpty=Nincs mit export\u00e1lni, a lista \u00fcres. +exportPlaylistResulted=Lej\u00e1tsz\u00e1si lista export\u00e1lva\: {0}\nK\u00e9s\u0151bb ezt a linket is megadhatod, hogy ezt a lej\u00e1tsz\u00e1si list\u00e1t elind\u00edtsd. +exportPlaylistFail=Nem siker\u00fclt felt\u00f6lteni a lej\u00e1tsz\u00e1si list\u00e1t a hastebin.com-ra listShowShuffled=\u00d6sszekevert lista mutat\u00e1sa. -listShowRepeatSingle=Mostani zene ism\u00e9tl\u00e9se. -listShowRepeatAll=Mostani sor ism\u00e9tl\u00e9se. +listShowRepeatSingle=Jelenlegi zene ism\u00e9tl\u00e9se. +listShowRepeatAll=Jelenlegi lista ism\u00e9tl\u00e9se. listShowHistory=Sz\u00e1mok mutat\u00e1sa az el\u0151zm\u00e9nyekben. listAddedBy=**{0}** hozz\u00e1 lett adva **{1}** `[{2}]` -listStreamsOnlySingle=Itt csak **{0}** \u00e9l {1} a sorban. -listStreamsOnlyMultiple=Itt **{0}** \u00e9l {1} a sor-ban. -listStreamsOrTracksSingle=Itt **{0}** {1} h\u00e1tramaradt id\u00f6 van a **[{2}]**{3} a list\u00e1ban. -listStreamsOrTracksMultiple=Itt **{0}** {1} van h\u00e1tra a **[{2}]**{3} list\u00e1ban. -streamSingular=folyam -streamPlural=folyamatok -listAsWellAsLiveStreams=, meg **{0}** \u00e9l\u00f6 {1} +listStreamsOnlySingle=**{0}** \u00e9l\u0151 {1} van a list\u00e1ban. +listStreamsOnlyMultiple=**{0}** \u00e9l\u0151 {1} vannak a list\u00e1ban. +listStreamsOrTracksSingle=There is **{0}** {1} with a remaining length of **[{2}]**{3} in the queue. +listStreamsOrTracksMultiple=There are **{0}** {1} with a remaining length of **[{2}]**{3} in the queue. +streamSingular=k\u00f6zvet\u00edt\u00e9s +streamPlural=k\u00f6zvet\u00edt\u00e9sek +listAsWellAsLiveStreams=, tov\u00e1bb\u00e1 **{0}** \u00e9l\u0151 {1} trackSingular=zene trackPlural=zen\u00e9k -npNotPlaying=Nem j\u00e1tszik semmit. +npNotPlaying=\u00c9ppen nem j\u00e1tszok semmit. npNotInHistory=Jelenleg nincsenek sz\u00e1mok az el\u0151zm\u00e9nyekben. npDescription=Le\u00edr\u00e1s -npLoadedSoundcloud=[{0}/{1}]\n\nBet\u00f6lt\u00f6tt a Soundcloud-r\u00f3l -npLoadedBandcamp={0}\n\nBet\u00f6lt\u00f6tt a Bandcamp-r\u00f6l -npLoadedTwitch=Bet\u00f6lt\u00f6tt Twitch-r\u00f6l -permissionMissingBot=Sz\u00fcks\u00e9gem van arra a jogosults\u00e1gra hogy v\u00e9grehajtsam a m\u00fcveletet\: +npLoadedSoundcloud=[{0}/{1}]\n\nSoundcloud-r\u00f3l bet\u00f6ltve +npLoadedBandcamp={0}\n\nBandcamp-r\u0151l bet\u00f6ltve +npLoadedTwitch=Twitch-r\u0151l bet\u00f6ltve +permissionMissingBot=A k\u00f6vetkez\u0151 jogosults\u00e1gra van sz\u00fcks\u00e9gem a m\u0171velet v\u00e9grehajt\u00e1s\u00e1hoz\: permissionEmbedLinks=Be\u00e1gyazott Linkek rating=\u00c9rt\u00e9kel\u00e9s listeners=Hallgat\u00f3k year=\u00c9v album=Album -artist=M\u00fcv\u00e9sz +artist=El\u0151ad\u00f3 circle=K\u00f6r -npLoadedFromHTTP={0}\n\nBet\u00f6lt\u00f6tt {1} -npLoadedDefault={0}\n\nBet\u00f6lt\u00f6tt {1} -noneYet=Nincs m\u00e9g -npRatingRange={0}/5 {1} szavaz\u00e1s(ok) -fwdSuccess=Tov\u00e1bb\u00edt\u00e1sa **{0}** {1}. -restartSuccess=**{0}** \u00fajraindult. +npLoadedFromHTTP={0}\n\nBet\u00f6ltve innen\: {1} +npLoadedDefault={0}\n\nBet\u00f6ltve innen\: {1} +noneYet=M\u00e9g nincs +npRatingRange={0}/5 {1} szavazat alapj\u00e1n +fwdSuccess=**{0}** el\u0151reteker\u00e9se {1}-el. +restartSuccess=**{0}** \u00fajraind\u00edtva. queueEmpty=A lista \u00fcres. -rewSuccess=Felh\u00faz\u00e1s **{0}** {1}. -seekSuccess=Keres\u00e9s **{0}** {1}. -seekDeniedLiveTrack=Nem kereshetsz egy \u00e9l\u0151 sz\u00e1mban. -loadPlaySplitListFail=A link egy lej\u00e1tsz\u00e1si list\u00e1hoz vezet, nem zen\u00e9hez. Pr\u00f3b\u00e1ld meg `;;play` helyett. -loadListSuccess=Tal\u00e1lt \u00e9s hozz\u00e1adott `{0}` zen\u00e9t a lej\u00e1tsz\u00e1si list\u00e1r\u00f3l **{1}**. -loadNoMatches=Nincs tal\u00e1lhat\u00f3 zene erre `{0}`. +rewSuccess=**{0}** visszatekerve {1}-el. +seekSuccess=**{0}** teker\u00e9se {1}-ra/re. +seekDeniedLiveTrack=Nem tekerhetsz bele \u00e9l\u0151 k\u00f6zvet\u00edt\u00e9sbe. +loadPlaySplitListFail=A link egy lej\u00e1tsz\u00e1si list\u00e1hoz vezet, nem zen\u00e9hez. Pr\u00f3b\u00e1ld ink\u00e1bb a `;;play` paranccsal. +loadListSuccess=`{0}` sz\u00e1mot tal\u00e1ltam \u00e9s adtam hozz\u00e1 a(z) **{1}** lej\u00e1tsz\u00e1si list\u00e1b\u00f3l. +loadNoMatches=Nem tal\u00e1ltam zen\u00e9t itt\: `{0}`. loadSplitNotYouTube=Ez nem egy YouTube zene. Csak YouTube zen\u00e9k t\u00e1mogatottak a `;;split` parancsal. Pr\u00f3b\u00e1ld haszn\u00e1lni a `;;play` helyett. -loadSplitNotResolves=Nem lehet feldolgozni annak a vide\u00f3nak a zen\u00e9j\u00e9t. Pr\u00f3b\u00e1ld haszn\u00e1lni a `;;play` helyett. -loadFollowingTracksAdded=A zen\u00e9k hozz\u00e1 lettek adva\: -loadPlaylistTooMany=Hozz\u00e1adott {0} zen\u00e9t. T\u00fal sok zen\u00e9t tal\u00e1lt a megjelen\u00edt\u00e9shez. -loadErrorCommon=Hiba t\u00f6rt\u00e9nt amikor az inform\u00e1ci\u00f3 t\u00f6lt\u00f6tt ehhez `{0}`\:{1} -loadErrorSusp=Gyan\u00fas hiba ennek a bet\u00f6lt\u00e9sekor `{0}`. -loadQueueTrackLimit=Nem tudsz t\u00f6bb zen\u00e9t enn\u00e9l {0} zen\u00e9n\u00e9l\! Ez m\u00e1r vissza\u00e9l\u00e9s. -loadAnnouncePlaylist=Lej\u00e1tsz\u00e1si lista bet\u00f6lt\u00e9se **{0}** ak\u00e1r `{1}` zene. Ez el tud tartani egy kis ideig, k\u00e9rlek legy\u00e9l t\u00fcrelmes. -playerUserNotInChannel=El\u00f6sz\u00f6r csatlakozz egy voice channel-hez. -playerJoinConnectDenied=Nincs jogom ahhoz a voice channel-hez csatlakozni. -playerJoinSpeakDenied=Nincs jogom zen\u00e9t j\u00e1tszani abba a voice channel-be. -playerNotInChannel=Nincs csatorn\u00e1ban. -playerLeftChannel=Kil\u00e9pett a csatorn\u00e1r\u00f3l {0}. -shutdownUpdating=FredBoat\u266a\u266afriss\u00edt. Ez eltarthat egy percig am\u00edg \u00fajrat\u00f6lti a jelenlegi lej\u00e1tsz\u00e1si list\u00e1t. -shutdownRestarting=FredBoat\u266a\u266a \u00fajraindul. Ez eltarthat egy percig \u00e9s \u00fajra fogja t\u00f6lteni a lej\u00e1tsz\u00e1si list\u00e1t. -shutdownIndef=FredBoat\u266a\u266a le\u00e1llt. Miut\u00e1n a bot visszaj\u00f6n a lej\u00e1tsz\u00e1si lista vissza fog t\u00f6lteni. +loadSplitNotResolves=Nem tal\u00e1lom a vide\u00f3 tartalmi list\u00e1j\u00e1t. Pr\u00f3b\u00e1ld ink\u00e1bb a `;;play` parancsot haszn\u00e1lni. +loadFollowingTracksAdded=A k\u00f6vetkez\u0151 zen\u00e9k hozz\u00e1 lettek adva\: +loadPlaylistTooMany={0} zene hozz\u00e1adva. T\u00fal sok zen\u00e9t tal\u00e1ltam a ki\u00edr\u00e1shoz. +loadErrorCommon=Hiba t\u00f6rt\u00e9nt az inform\u00e1ci\u00f3 bet\u00f6lt\u00e9sekor innen\:`{0}`\:\n{1} +loadErrorSusp=Gyan\u00fas hiba `{0}` bet\u00f6lt\u00e9se k\u00f6zben. +loadQueueTrackLimit=Nem adhatsz hozz\u00e1 t\u00f6bb, mint {0} sz\u00e1mot a list\u00e1hoz\! Ez a vissza\u00e9l\u00e9sek elker\u00fcl\u00e9se \u00e9rdek\u00e9ben van. +loadAnnouncePlaylist=About to load playlist **{0}** with up to `{1}` tracks. This may take a while, please be patient. +playerUserNotInChannel=El\u0151bb csatlakozz egy hang csatorn\u00e1hoz. +playerJoinConnectDenied=Nem csatlakozhatok ahhoz a hang csatorn\u00e1hoz. +playerJoinSpeakDenied=Nem j\u00e1tszhatok zen\u00e9t abban a hang csatorn\u00e1ban. +playerNotInChannel=Jelenleg nem vagyok hang csatorn\u00e1ban. +playerLeftChannel=Kil\u00e9ptem a(z) {0} csatorn\u00e1b\u00f3l. +shutdownUpdating=FredBoat\u266a\u266a friss\u00edt. Ez csak egy percig tart, \u00e9s \u00fajra fogja t\u00f6lteni a jelenlegi lej\u00e1tsz\u00e1si list\u00e1t. +shutdownRestarting=FredBoat\u266a\u266a \u00fajraindul. Ez csak egy percig tart \u00e9s \u00fajra fogja t\u00f6lteni a lej\u00e1tsz\u00e1si list\u00e1t. +shutdownIndef=FredBoat\u266a\u266a le\u00e1ll. Amint a bot visszaj\u00f6n, a jelenlegi lej\u00e1tsz\u00e1si list\u00e1t \u00fajra fogja t\u00f6lteni. shutdownPersistenceFail=Hiba t\u00f6rt\u00e9nt a f\u00e1jl ment\u00e9sekor\: {0} -reloadSuccess=Lej\u00e1tsz\u00e1si lista \u00fajrat\u00f6lt\u00e9se. `{0}` zen\u00e9t tal\u00e1lt. -trackAnnounce=\u00c9ppen ezt j\u00e1tsza **{0}**. +reloadSuccess=Lej\u00e1tsz\u00e1si lista \u00fajrat\u00f6lt\u00e9se. `{0}` zen\u00e9t tal\u00e1ltam. +trackAnnounce=**{0}** lej\u00e1tsz\u00e1sa. cmdAccessDenied=Nincs enged\u00e9lyed haszn\u00e1lni ezt a parancsot\! utilErrorOccurred=\ hiba t\u00f6rt\u00e9nt \:anger\: ```java\n{0}\n -errorOccurredTooLong=Hiba t\u00f6rt\u00e9nt \:anger\: Hiba megjelen\u00edt\u00e9se t\u00fal hossz\u00fa volt.\n{0}.txt +errorOccurredTooLong=Hiba t\u00f6rt\u00e9nt \:anger\: A hiba t\u00fal hossz\u00fa volt a megjelen\u00edt\u00e9shez.\n{0}.txt errorOccurredTooLongAndUnirestException=Hiba t\u00f6rt\u00e9nt \:anger\: T\u00fal hossz\u00fa volt \u00e9s nem siker\u00fclt posztolni a Hastebin-re\! -malRevealAnime={0}\: Keres\u00e9s anime-ra.\n +malRevealAnime={0}\: A keres\u00e9s tal\u00e1lt egy anime-t.\n malTitle={0}**C\u00edm\: **{1}\n malEnglishTitle={0}**Angol\: **{1}\n malSynonyms={0}**Szinonim\u00e1k\: **{1}\n @@ -116,84 +116,85 @@ malType={0}**T\u00edpus\: **{1}\n malStatus={0}**\u00c1llapot\: **{1}\n malStartDate={0}**Kezd\u00e9s d\u00e1tuma\: **{1}\n malEndDate={0}**Z\u00e1r\u00f3 d\u00e1tum\: **{1} -malSynopsis={0}**Szinopszis\: **"{1}"\n -malUserReveal={0}\: Felt\u00e1rt haszn\u00e1l\u00f3 keres\u00e9se.\n +malSynopsis={0}**\u00d6sszefoglal\u00f3\: **"{1}"\n +malUserReveal={0}\: A keres\u00e9s tal\u00e1lt egy felhaszn\u00e1l\u00f3t.\n malNoResults={0}\: Nincs tal\u00e1lat. malUserName={0}**N\u00e9v\: **{1}\n malUrl={0}**URL\: **{1}\n -luaError=\ A Lua hiba \:anger\:\n```{0}``` -luaErrorOutputTooBig=\ A sz\u00f6veg t\u00fal nagy \:anger\: Discord csak 2000 karaktert enged\u00e9lyez \u00fczenetenk\u00e9nt, van {0} +luaError=\ Egy Lua hiba \:anger\:\n```{0}``` +luaErrorOutputTooBig=\ A kimenet t\u00fal hossz\u00fa \:anger\: A Discord legfeljebb 2000 karaktert enged\u00e9lyez \u00fczenetenk\u00e9nt, {0} karakter hossz\u00fa lenne luaTimeout=\ Funkci\u00f3 id\u00f6t\u00fall\u00e9p\u00e9s \:anger\: enged\u00e9lyezett id\u00f6 {0} m\u00e1sodperc. -helpSuccess=Dokumentum elk\u00fcldve a direkt \u00fczeneteidhez\! -helpDmFailed=A dokument\u00e1ci\u00f3t nem siker\u00fclt PM-ben elk\u00fcldeni. Ellen\u0151rizd le, hogy nem kapcsoltad-e ki\! -helpCommandsPromotion=Ird {0} hogy tanulj mit tud ez a bot csin\u00e1lni\! +helpSuccess=Dokument\u00e1ci\u00f3 elk\u00fcldve priv\u00e1t \u00fczenetben\! +helpDmFailed=A dokument\u00e1ci\u00f3t nem siker\u00fclt priv\u00e1t \u00fczenetben elk\u00fcldeni. Ellen\u0151rizd le, hogy enged\u00e9lyezve van-e a priv\u00e1t \u00fczenetk\u00fcld\u00e9s\! +helpCommandsPromotion={0} paranccsal megtudhatod, hogy mire k\u00e9pes ez a bot\! +musicCommandsPromotion=K\u00fcldd ezt\: "{0}" a teljes list\u00e1\u00e9rt a zen\u00e9vel kapcsolatos parancsokkal. fuzzyNoResults=Nincs ilyen felhaszn\u00e1l\u00f3 -brainfuckCycleLimit=A program meghaladta a maximum ciklus sz\u00e1m\u00e1t\n{0} -brainfuckDataPointerOutOfBounds=Adat mutat\u00f3nak nincs t\u00f6bb helye\: {0} -brainfuckInputOOB=Glm helyzete\: {0} -brainfuckNoOutput=\ Nem volt semmi +brainfuckCycleLimit=A program t\u00fall\u00e9pte a maxim\u00e1lis ciklus sz\u00e1mot, ami {0} +brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} +brainfuckInputOOB=Input out of bounds at position\: {0} +brainfuckNoOutput=\ Nem volt kimenet weatherLocationNotFound=Hely keres\u00e9se sikertelen, k\u00e9rj\u00fck ellen\u0151rizd a bevitelt {0}. weatherError=Hiba az id\u0151j\u00e1r\u00e1si adatok lek\u00e9r\u00e9s\u00e9ben {0}-hoz avatarSuccess=\ megtal\u00e1ltam\n{0} -configNoArgs=Konfigur\u00e1ci\u00f3 ehhez **{0}**\:``` -configSetTo=\u00e1llitva van erre `{0}`. +configNoArgs=**{0}** be\u00e1ll\u00edt\u00e1sai\:``` +configSetTo=mostant\u00f3l `{0}`. configUnknownKey={0}\: Ismeretlen kulcs. -configMustBeBoolean={0}\: A sz\u00e1m igaz vagy hamis. -modReason=Ok +configMustBeBoolean={0}\: Az \u00e9rt\u00e9k igaz vagy hamis kell legyen. +modReason=Indok modAuditLogMessage=Action issued by {0}\#{1} [{2}] -modFailUserHierarchy=Nincs magasabb rangod enn\u00e9l {0}. -modFailBotHierarchy=Magasabb rangomnak kell lenni enn\u00e9l {0}. -modBanFail=Nem siker\u00fclt bannolni {0} -modKickBanFailUserPerms=Neked jogosults\u00e1gra van sz\u00fcks\u00e9ged hogy bannolhass vagy kickelj. -modBanBotPerms=Ban enged\u00e9lyem kell hogy legyen emberek bannol\u00e1s\u00e1hoz. -modKickBotPerms=Jogosults\u00e1g kell emberek kir\u00fag\u00e1s\u00e1ra. -kickSuccess=Felhaszn\u00e1l\u00f3 {0}\#{1} [{2}] ki lett r\u00fagva. -kickFail=Nem siker\u00fclt kir\u00fagni {0} +modFailUserHierarchy=Nincs magasabb rangod enn\u00e9l\: {0} +modFailBotHierarchy=Magasabb rangomnak kell lenni enn\u00e9l\: {0} +modBanFail=Nem siker\u00fclt {0}-t kitiltani +modKickBanFailUserPerms=Kir\u00fag\u00e1si \u00e9s kitilt\u00e1si jogosults\u00e1god kell legyen, hogy haszn\u00e1lhasd ezt a parancsot. +modBanBotPerms=Jogosults\u00e1gra van sz\u00fcks\u00e9gem, hogy kitilthassak tagokat. +modKickBotPerms=Jogosults\u00e1gra van sz\u00fcks\u00e9gem, hogy kir\u00faghassak tagokat. +kickSuccess={0}\#{1} [{2}] felhaszn\u00e1l\u00f3 ki lett r\u00fagva. +kickFail=Nem siker\u00fclt kir\u00fagni {0}-t kickFailSelf=Nem r\u00faghatod ki magad. -kickFailOwner=Nem r\u00faghatod ki a szerver tulajdonost. -kickFailMyself=Nem tudom kir\u00fagni magam. -kickFailUserPerms=Jogosults\u00e1g kell hogy haszn\u00e1lhasd ezt a parancsot. -softbanSuccess=Felhaszn\u00e1l\u00f3 {0}\#{1} [{2}] ki lett bannolva. -softbanFailSelf=Nem tudod bannolni magad. -softbanFailOwner=Nem tudod bannolni a tulajdonost. -softbanFailMyself=Nem bannolhatom magam. -hardbanSuccess=Felhaszn\u00e1l\u00f3 {0}\#{1} [{2}] bannolva lett. -hardbanFailSelf=Nem bannolhatod magad. -hardbanFailOwner=Nem bannolhatod a szerver tulajdonost. -hardbanFailMyself=Nem tudom bannolni magam. -getidSuccess=Ez a csoport azonos\u00edt\u00f3ja {0}. Ez a sz\u00f6veg csatorna azonos\u00edt\u00f3ja {1}. -statsParagraph=\ Ez a bot megy m\u00e1r {0} napja, {1}\n\u00f3r\u00e1ja, {2} perce \u00e9s {3} m\u00e1sodperce.\nEz a bot v\u00e9grehajtotta ezeket parancsokat {4}. -statsRate={0}Ez az \u00e9rt\u00e9kel\u00e9se a {1} parancsoknak \u00f3r\u00e1nk\u00e9nt -catgirlFail=Hiba a k\u00e9p kibont\u00e1sakor innen {0} -catgirlFailConn=Hiba a csatlakoz\u00e1shoz ide {0} +kickFailOwner=Nem r\u00faghatod ki a szervertulajdonost. +kickFailMyself=Nem r\u00faghatom ki magam. +kickFailUserPerms=Kir\u00fag\u00e1si jogosults\u00e1god kell legyen, hogy haszn\u00e1lhasd ezt a parancsot. +softbanSuccess=User {0}\#{1} [{2}] has been softbanned. +softbanFailSelf=You can't softban yourself. +softbanFailOwner=You can't softban the server owner. +softbanFailMyself=I can't softban myself. +hardbanSuccess={0}\#{1} [{2}] felhaszn\u00e1l\u00f3 ki lett tiltva. +hardbanFailSelf=Nem tilthatod ki magad. +hardbanFailOwner=Nem tilthatod ki a szervertulajdonost. +hardbanFailMyself=Nem tilthatom ki magam. +getidSuccess=A szerver azonos\u00edt\u00f3ja {0}. A sz\u00f6veges csatorna azonos\u00edt\u00f3ja {1}. +statsParagraph=\ Ez a bot m\u00e1r {0} napja, {1} \u00f3r\u00e1ja, {2} perce \u00e9s {3} m\u00e1sodperce megy.\n{4} parancsot hajtott v\u00e9gre ez id\u0151 alatt. +statsRate={0}That''s a rate of {1} commands per hour +catgirlFail=Failed to extract image from {0} +catgirlFailConn=Nem siker\u00fclt csatlakozni ide\: {0} hugBot=K\u00f6sz\u00f6n\u00f6m az \u00f6lel\u00e9st \:blush\: -hugSuccess=\u00d6lel\u00e9s {0}. -patBot=K\u00f6szi a pat-\u00e9r \:blush\: -patSuccess=Pat {0}. +hugSuccess={0} meg\u00f6lel\u00e9se. +patBot=K\u00f6sz\u00f6n\u00f6m a simogat\u00e1st \:blush\: +patSuccess={0} simogat\u00e1sa. rollSuccess={0} gurul a f\u00f6ld\u00f6n. -facedeskSuccess={0} arck\u00e9p. +facedeskSuccess={0} facedesks. langInvalidCode=A nyelv k\u00f3d {0} nem l\u00e9tezik vagy nem t\u00e1mogatott. -langSuccess=Besz\u00e9dhez kapcsolt {0}. -langInfo=FredBoat t\u00e1mogat minden nyelvet amit ezzel a parancsal tudsz el\u00e9rni. Az adminok ezen a szerveren tudnak nyelvet v\u00e1lasztani ezzel `;;lang ` Itt van egy lista a t\u00e1mogatott nyelvekr\u00f6l\: -langDisclaimer=A ford\u00edt\u00e1s m\u00e9g nem 100% pontos vagy teljes. Hi\u00e1nyz\u00f3 ford\u00edt\u00e1sokhoz itt tudsz hozz\u00e1f\u00e9rni\n. +langSuccess=\u00c1tv\u00e1ltottam {0} besz\u00e9dre. +langInfo=FredBoat sz\u00e1mos nyelvet t\u00e1mogat felhaszn\u00e1l\u00f3k \u00e1ltal k\u00f6zrem\u0171k\u00f6dve, amik k\u00f6z\u00fcl ezzel a paranccsal tudsz v\u00e1lasztani. A szerver adminjai tudnak nyelvet v\u00e1lasztani a `;;lang ` paranccsal. Itt a teljes lista a t\u00e1mogatott nyelvekr\u0151l\: +langDisclaimer=A ford\u00edt\u00e1s m\u00e9g nem 100%-osan pontos vagy teljes. A hi\u00e1nyz\u00f3 ford\u00edt\u00e1sokhoz itt tudsz hozz\u00e1j\u00e1rulni\: . loadSingleTrack=**{0}** hozz\u00e1 lett adva a list\u00e1hoz. -loadSingleTrackAndPlay=**{0}** menni fog. -invite=Megh\u00edv\u00f3 link neki **{0}**\: -ratelimitedGeneralInfo=Lelet\u00e9l sebess\u00e9g korl\u00e1t\u00f3zva\! K\u00e9rem, lass\u00edtson. -ratelimitedSkipCommand=E parancs haszn\u00e1lat\u00e1val \u00e1tugorhat egyn\u00e9l t\u00f6bb sz\u00e1mot\: {0} -ratelimitedGuildSlowLoadingPlaylist=Ez a szerver nem enged\u00e9lyezett ahoz t\u00f6bb lej\u00e1tsz\u00e1si list\u00e1t j\u00e1tsz\u00f3n le, ebben a pillanatban. K\u00e9rj\u00fck, ne spamelj hossz\u00fa list\u00e1kat. -unblacklisted=Elt\u00e1volitva {0} a a feketelist\u00e1ra. -serverinfoTitle=Info about {0}\: +loadSingleTrackAndPlay=**{0}** ind\u00edt\u00e1sa. +invite=**{0}** megh\u00edv\u00f3ja\: +ratelimitedGeneralInfo=Korl\u00e1tozva lett\u00e9l\! K\u00e9rlek lass\u00edts. +ratelimitedSkipCommand=Ezzel a paranccsal egyn\u00e9l t\u00f6bb sz\u00e1mot is \u00e1tugorhatsz\: {0} +ratelimitedGuildSlowLoadingPlaylist=Ez a szerver nem adhat hozz\u00e1 t\u00f6bb lej\u00e1tsz\u00e1si list\u00e1t jelenleg. K\u00e9rlek ne adj hozz\u00e1 sok hossz\u00fa lej\u00e1tsz\u00e1si list\u00e1t. +unblacklisted={0} elt\u00e1vol\u00edtva a feketelist\u00e1r\u00f3l. +serverinfoTitle=Inf\u00f3 a(z) {0} szerverr\u0151l\: serverinfoOnlineUsers=Online Felhaszn\u00e1l\u00f3k\: serverinfoTotalUsers=\u00d6sszes Felhaszn\u00e1l\u00f3\: -serverinfoRoles=Szerepk\u00f6r\u00f6k\: +serverinfoRoles=Rangok\: serverinfoText=Sz\u00f6veg Csatorn\u00e1k\: serverinfoVoice=Besz\u00e9d Csatorn\u00e1k\: -serverinfoGuildID=Guild Azonos\u00edt\u00f3\: +serverinfoGuildID=Szerver azonos\u00edt\u00f3\: serverinfoCreationDate=L\u00e9trehoz\u00e1s D\u00e1tuma\: serverinfoOwner=Tulajdonos\: -serverinfoVLv=Ellen\u00f6rz\u00e9si Szint\: -userinfoTitle=Information about {0}\: +serverinfoVLv=Ellen\u0151rz\u00e9si Szint\: +userinfoTitle=Inform\u00e1ci\u00f3 {0} felhaszn\u00e1l\u00f3r\u00f3l\: userinfoUsername=Felhaszn\u00e1l\u00f3n\u00e9v\: userinfoId=Azonos\u00edt\u00f3\: userinfoNick=Becen\u00e9v\: @@ -202,104 +203,122 @@ userinfoJoinDate=Csatlakoz\u00e1s D\u00e1tuma\: userinfoCreationTime=L\u00e9trehoz\u00e1s D\u00e1tuma\: userinfoBlacklisted=Tilt\u00f3list\u00e1n\: skipDeniedTooManyTracks=Nem ugorhatod \u00e1t valaki m\u00e1s sz\u00e1m\u00e1t ha nem vagy DJ.\nFontold meg a Voteskip parancs haszn\u00e1lat\u00e1t. -eventUsersLeftVC=Minden felhaszn\u00e1l\u00f3 lel\u00e9pett. A lej\u00e1tsz\u00f3 meg lett \u00e1ll\u00edtva. -eventAutoResumed=Felhaszn\u00e1l\u00f3 \u00e9szlelve, lej\u00e1tsz\u00f3 automatikus ind\u00edt\u00e1sa. +eventUsersLeftVC=Minden felhaszn\u00e1l\u00f3 elhagyta a hang csatorn\u00e1t. A lej\u00e1tsz\u00e1s most sz\u00fcnetel. +eventAutoResumed=Felhaszn\u00e1l\u00f3 \u00e9szlelve, lej\u00e1tsz\u00f3 automatikus folytat\u00e1sa. commandsFun=Sz\u00f3rakoz\u00e1s commandsMemes=M\u00e9mek -commandsUtility=Seg\u00e9dprogram +commandsUtility=Eszk\u00f6z\u00f6k commandsModeration=Moder\u00e1l\u00e1s -commandsMaintenance=Karbantart\u00e1s alatt +commandsMaintenance=Karbantart\u00e1s commandsBotOwner=Bot tulajdonos -commandsMoreHelp=Irj {0} hogy kapj t\u00f6bb inform\u00e1ci\u00f3t. +commandsMoreHelp=Mondd {0} hogy t\u00f6bbet megtudj egy adott parancsr\u00f3l. +commandsModulesHint=Tov\u00e1bbi modulokat enged\u00e9lyezhetsz vagy tilthatsz le ezzel a paranccsal\: {0} helpUnknownCommand=Ismeretlen parancs. -helpDocsLocation=Documentation can be found at\: -helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: -helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! -helpNoDmCommands=You cannot send FredBoat commands through DMs. -helpCredits=Created by Fre_d and open source contributors -helpSent=A dokumentum el lett k\u00fcldve a DM edhez\! -helpProperUsage=Megfelel\u00f6 haszn\u00e1lat\: -helpCommandOwnerRestricted=Ez a command csak a tulajdonosra \u00e9s a botra tartozik. -helpConfigCommand=Mutasd meg ez a szerver be\u00e1ll\u00edt\u00e1sait. -helpLanguageCommand=Mutasd meg az el\u00e9rhet\u00f6 nyelveket. -helpHardbanCommand=Bannold a felhaszn\u00e1l\u00f3t \u00e9s t\u00f6r\u00f6ld az ezel\u00f6tti 7 nap \u00fczenet\u00e9t. -helpKickCommand=R\u00fagj ki egy felhaszn\u00e1l\u00f3t err\u00f6l a szerverr\u00f6l. -helpSoftbanCommand=Felhaszn\u00e1l\u00f3 gyenge bannol\u00e1sa \u00e9s ez a 7 napi \u00fczenetei t\u00f6rl\u00e9se. +helpDocsLocation=A dokument\u00e1ci\u00f3t megtal\u00e1lod itt\: +helpBotInvite=Szeretn\u00e9d FredBoat-ot megh\u00edvni a saj\u00e1t szerveredre? Ha van "Manage Server" jogod az adott szerveren, akkor megh\u00edvhatod FreadBoat-ot\: +helpHangoutInvite=Seg\u00edts\u00e9gre van sz\u00fcks\u00e9ged, vagy \u00f6tleted volna FredBoat-hoz? Tal\u00e1n csak haverkodn\u00e1l? Csatlakozz a FredBoat k\u00f6z\u00f6ss\u00e9ghez\! +helpNoDmCommands=Nem k\u00fcldhetsz parancsokat FredBoat-nak priv\u00e1t \u00fczenetk\u00e9nt. +helpCredits=K\u00e9sz\u00edtette\: Fre_d \u00e9s a ny\u00edlt forr\u00e1sk\u00f3d\u00fa szerkeszt\u0151k +helpSent=A dokumentum el lett k\u00fcldve priv\u00e1t \u00fczenetben\! +helpProperUsage=Megfelel\u0151 haszn\u00e1lat\: +helpCommandOwnerRestricted=Ezt a parancsot csak a bot tulajdonosa haszn\u00e1lhatja. +helpConfigCommand=Megjelen\u00edti a szerver be\u00e1ll\u00edt\u00e1sait, vagy m\u00f3dos\u00edtja azokat. +helpLanguageCommand=Megjelen\u00edti az el\u00e9rhet\u0151 nyelveket, vagy \u00e1t\u00e1ll\u00edtja ezen a szerveren a nyelvet. +helpModules=Parancs modulok megtekint\u00e9se, enged\u00e9lyez\u00e9se vagy letilt\u00e1sa ezen a szerveren. +helpHardbanCommand=Felhaszn\u00e1l\u00f3 kitilt\u00e1sa \u00e9s az utols\u00f3 7 napban k\u00fcld\u00f6tt \u00fczenetei t\u00f6rl\u00e9se. +helpKickCommand=Kir\u00fag egy felhaszn\u00e1l\u00f3t err\u0151l a szerverr\u0151l. +helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. helpMusicCommandsHeader=FredBoat Zene Parancsok -helpJoinCommand=Csin\u00e1ld meg a botot hogy csatlakozzon a voice channelhez. -helpLeaveCommand=Csin\u00e1ld meg a botot hogy lel\u00e9pjen a voice channelr\u00f6l. -helpPauseCommand=Sz\u00fcneteld a lej\u00e1tsz\u00f3t. -helpPlayCommand=J\u00e1tssz le egy zen\u00e9t a megadott URL alapj\u00e1n vagy keress egy sz\u00e1mo. A forr\u00e1sok teljes list\u00e1j\u00e1hoz k\u00e9rj\u00fck l\u00e1togasd meg a {0} oldalt -helpPlaySplitCommand=YouTube vide\u00f3 feloszt\u00e1sa a list\u00e1ba. -helpRepeatCommand=Ism\u00e9tl\u00f6 m\u00f3d k\u00f6z\u00f6tt kapcsold be. -helpReshuffleCommand=Keverd \u00f6ssze a list\u00e1t. -helpSelectCommand=V\u00e1lasz egy zene k\u00f6z\u00fcl keres\u00e9s ut\u00e1n. -helpShuffleCommand=Kapcsold be az \u00f6sszekevert m\u00f3dot a list\u00e1hoz. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. -helpStopCommand=Lej\u00e1tsz\u00f3 le\u00e1ll\u00edt\u00e1sa \u00e9s lista \u00fcr\u00edt\u00e9se. Moder\u00e1torok tudj\u00e1k haszn\u00e1lni \u00dczenet Kezel\u00e9s enged\u00e9llyel. -helpUnpauseCommand=Lej\u00e1tsz\u00f3 elind\u00edt\u00e1sa. -helpVolumeCommand=V\u00e1ltoztatja a hanger\u00f6t. 0-150 \u00e9s 100 az alap. A hanger\u00f6 parancs csak a publikos boton hajthat\u00f3 v\u00e9gre. -helpExportCommand=Export\u00e1ld a mostani list\u00e1t hastebin-re k\u00e9s\u00f6bb lehet \u00fajra haszn\u00e1lni. -helpGensokyoRadioCommand=Mutasd meg a mostani zen\u00e9t a gensokyoradio.net-en -helpListCommand=Mutasd meg a mostani zen\u00e9ket a lej\u00e1tsz\u00e1si list\u00e1ban. -helpHistoryCommand=Display a list of the songs in playlist history. -helpNowplayingCommand=Mutasd meg a mostani zen\u00e9t. -helpForwardCommand=Tov\u00e1bb\u00edtsd a zen\u00e9t megadva az id\u00f6t.\nP\u00e9lda\: -helpRestartCommand=Mostani zene \u00fajraind\u00edt\u00e1sa. -helpRewindCommand=Zene visszateker\u00e9se a megadott id\u00f6vel.\nP\u00e9lda\: -helpSeekCommand=\u00c1ll\u00edtsd be a zene hely\u00e9t a megadott id\u00f6vel.\nP\u00e9lda\: -helpAvatarCommand=Mutasd meg a felhaszn\u00e1l\u00f3 profilk\u00e9p\u00e9t. -helpBrainfuckCommand=V\u00e9grehajtja az Agybasz\u00f3 k\u00f3dot. P\u00e9lda\: -helpWeatherCommand=Display current weather by location. -helpClearCommand=\u00d6sszes \u00fczenet t\u00f6rl\u00e9se ett\u00f6l a bot-t\u00f3l az elm\u00falt 50 napban. -helpCommandsCommand=Mutasd meg az el\u00e9rhet\u00f6 parancsokat. -helpHelpCommand=Seg\u00edts\u00e9g kap\u00e1s ehhez a bothoz b\u00e1rmilyen parancshoz. -helpInviteCommand=Megh\u00edv\u00f3 link posztol\u00e1sa ehhez a bothoz. -helpMALCommand=Keressen a MyAnimeList en \u00e9s j\u00e1tszon le egy anime-t a profilr\u00f3l. -helpMusicHelpCommand=Mutassa meg a zene parancsokat \u00e9s haszn\u00e1lat\u00e1t. -helpSayCommand=Csin\u00e1ld meg a botot visszhangoss\u00e1. -helpServerInfoCommand=Jelenits meg statisztik\u00e1kat err\u00f6l a guildr\u00f3l. -helpUserInfoCommand=Inform\u00e1ci\u00f3k megjelen\u00edt\u00e9se r\u00f3lad vagy egy felhaszn\u00e1l\u00f3r\u00f3l aki ismeri a botot. +helpJoinCommand=Make the bot join your current voice channel. +helpLeaveCommand=Make the bot leave the current voice channel. +helpPauseCommand=Lej\u00e1tsz\u00f3 sz\u00fcneteltet\u00e9se. +helpPlayCommand=Zene lej\u00e1tsz\u00e1sa a megadott linken, vagy sz\u00e1m keres\u00e9se. A forr\u00e1sok teljes list\u00e1j\u00e1\u00e9rt l\u00e1togass el ide\: {0} +helpPlaySplitCommand=Egy YouTube vide\u00f3 feloszt\u00e1sa sz\u00e1mokra a le\u00edr\u00e1sa alapj\u00e1n. +helpRepeatCommand=Ism\u00e9tl\u00e9s m\u00f3dok k\u00f6z\u00f6tti v\u00e1lt\u00e1s. +helpReshuffleCommand=A jelenlegi lej\u00e1tsz\u00e1si lista \u00fajrakever\u00e9se. +helpSelectCommand=V\u00e1laszthatsz a felaj\u00e1nlott sz\u00e1mok k\u00f6z\u00fcl keres\u00e9s ut\u00e1n. +helpShuffleCommand=Jelenlegi lista kever\u00e9s be- vagy kikapcsol\u00e1sa. +helpSkipCommand=A jelenlegi zene \u00e1tugr\u00e1sa, n-edik zene \u00e1tugr\u00e1sa, minden zene \u00e1tugr\u00e1sa n-t\u0151l m-ig, vagy minden zene \u00e1tugr\u00e1sa az eml\u00edtett felhaszn\u00e1l\u00f3t\u00f3l. K\u00e9rlek haszn\u00e1ld moder\u00e1ltan. +helpStopCommand=Meg\u00e1ll\u00edtja a lej\u00e1tsz\u00f3t \u00e9s t\u00f6rli a lej\u00e1tsz\u00e1si list\u00e1t. fenntartva moder\u00e1toroknak \u00fczenet kezel\u00e9s jogosults\u00e1ggal. +helpUnpauseCommand=Lej\u00e1tsz\u00e1s folytat\u00e1sa. +helpVolumeCommand=Be\u00e1ll\u00edtja a hangot. Az \u00e9rt\u00e9k 0 \u00e9s 150 k\u00f6z\u00f6tti kell legyen, \u00e9s 100 az alap\u00e9rtelmezett. A "volume" parancs nem m\u0171k\u00f6dik a publikus boton. +helpExportCommand=Export\u00e1lja a jelenlegi lej\u00e1tsz\u00e1si list\u00e1t hastebin linkre, k\u00e9s\u0151bb haszn\u00e1lhat\u00f3 lej\u00e1tsz\u00e1si listak\u00e9nt. +helpGensokyoRadioCommand=Megjelen\u00edti a jelenleg j\u00e1tszott sz\u00e1mot a gensokyoradio.net-en +helpListCommand=Megjelen\u00edti a jelenlegi lej\u00e1tsz\u00e1si list\u00e1n l\u00e9v\u0151 sz\u00e1mokat. +helpHistoryCommand=Megjelen\u00edti a lej\u00e1tsz\u00e1si el\u0151zm\u00e9nyben l\u00e9v\u0151 dalok list\u00e1j\u00e1t. +helpNowplayingCommand=Megjelen\u00edti a most j\u00e1tszott sz\u00e1mot. +helpForwardCommand=Forward the track by a given amount of time. Example\: +helpRestartCommand=Restart the currently playing track. +helpRewindCommand=Zene visszateker\u00e9se a megadott id\u0151vel. P\u00e9lda\: +helpSeekCommand=Set the position of the track to the given time. Example\: +helpAvatarCommand=Display the avatar of a user. +helpBrainfuckCommand=Executes Brainfuck code. Example\: +helpWeatherCommand=Megjelen\u00edti a jelenlegi id\u0151j\u00e1r\u00e1st hely alapj\u00e1n. +helpClearCommand=Delete all messages by this bot in the last 50 messages of this channel. +helpCommandsCommand=Show available commands. +helpHelpCommand=Receive help for this bot or help for any command. +helpInviteCommand=Elk\u00fcldi a bot megh\u00edv\u00f3 linkj\u00e9t. +helpMALCommand=Keres\u00e9s a MyAnimeList-en \u00e9s egy anime vagy egy felhaszn\u00e1l\u00f3 profilj\u00e1nak megjelen\u00edt\u00e9se. +helpMusicHelpCommand=Zene parancsok \u00e9s azok haszn\u00e1lat\u00e1nak megjelen\u00edt\u00e9se. +helpSayCommand=Megk\u00e9ri a botot, hogy \u00edrjon valamit. +helpServerInfoCommand=N\u00e9h\u00e1ny statisztika megjelen\u00edt\u00e9se err\u0151l a szerverr\u0151l. +helpUserInfoCommand=Inform\u00e1ci\u00f3k megjelen\u00edt\u00e9se r\u00f3lad vagy egy, a bot \u00e1ltal ismert felhaszn\u00e1l\u00f3r\u00f3l. helpPerms=Allows whitelisting members and roles for the {0} rank. -helpPrefixCommand=Set the prefix for this guild. -helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. -helpMathOperationAdd=Ki\u00edrja num1 \u00e9s num2 \u00f6sszeg\u00e9t. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. -destroyDenied=Az \u00fczenet j\u00f3gokat \u00e1tkell\u00e1litan\u00f3d hogy \u00fajra inditsd a lej\u00e1tsz\u00f3t. -destroyHelp=Lej\u00e1tsz\u00f3 ujra ind\u00edt\u00e1sa \u00e9s lista \u00fcr\u00edt\u00e9se. Moder\u00e1torok tudj\u00e1k haszn\u00e1lni \u00dczenet Kezel\u00e9s enged\u00e9llyel. -destroySucc=Ujra ind\u00edtva a lej\u00e1tsz\u00f3, \u00e9s a v\u00e1r\u00f3lista t\u00f6r\u00f6lve. +helpPrefixCommand=Be\u00e1ll\u00edtja az el\u0151tagot ezen a szerveren. +helpVoteSkip=Szavaz\u00e1s a jelenlegi zene \u00e1tugr\u00e1s\u00e1r\u00f3l. Legal\u00e1bb a szob\u00e1ban l\u00e9v\u0151 felhaszn\u00e1l\u00f3k 50%-\u00e1nak szavaznia kell. +helpMathOperationAdd=Ki\u00edrja sz\u00e1m1 \u00e9s sz\u00e1m2 \u00f6sszeg\u00e9t. +helpMathOperationSub=Ki\u00edrja sz\u00e1m1 \u00e9s sz\u00e1m2 k\u00fcl\u00f6nbs\u00e9g\u00e9t. +helpMathOperationMult=Ki\u00edrja sz\u00e1m1 \u00e9s sz\u00e1m2 szorzat\u00e1t. +helpMathOperationDiv=Ki\u00edrja sz\u00e1m1 osztva sz\u00e1m2 h\u00e1nyados\u00e1t. +helpMathOperationMod=Ki\u00edrja sz\u00e1m1 osztva sz\u00e1m2 marad\u00e9k\u00e1t. +helpMathOperationPerc=Ki\u00edrja a sz\u00e1m1 osztva sz\u00e1m2 sz\u00e1zal\u00e9kos ar\u00e1ny\u00e1t. +helpMathOperationSqrt=Ki\u00edrja egy sz\u00e1m n\u00e9gyzetgy\u00f6k\u00e9t. +helpMathOperationPow=Ki\u00edrja sz\u00e1m1 sz\u00e1m2-edik hatv\u00e1ny\u00e1t. +destroyDenied=You must have the manage messages permission to reset the player. +destroyHelp=Reset the player and clear the playlist. Reserved for moderators with Manage Messages permission. +destroySucc=Reset the player and cleared the queue. listPageNum=Oldal **{0} ** a **{1} **-b\u00f3l. -permsListTitle=Users and roles with the {0} permissions -permsAdded=Hozzaadva ''{0}'' ''{1}'' -hoz. -permsRemoved=Torolve ''{0}'' ''{1}'' -bol. -permsFailSelfDemotion=Ehhez nincs jogod\! -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} -fuzzyMultiple=Multiple items were found. Did you mean any of these? -fuzzyNothingFound=Nem talalom ''{0}''. -cmdPermsTooLow=Ehhez nincs jogod\! -playersLimited=FredBoat \u00e9ppen maximum kapacit\u00e1son van\! A bot \u00e9ppen r\u00f6gz\u00edtett hogy csak `{0}` helyen \u00e1ramoljon, m\u00e1sk\u00e9ppen megkock\u00e1ztatn\u00e1nk, hogy lecsatlakozzon a Discord-r\u00f3l h\u00e1l\u00f3zat t\u00f6lt\u00e9se k\u00f6zben.\nHa seg\u00edteni akarsz n\u00f6velni a limitet vagy nem t\u00falzs\u00fafolt botot akarsz haszn\u00e1lni, k\u00e9rlek seg\u00edts a munk\u00e1nkon a Patreon oldalon\:\n{1}\n\nEln\u00e9z\u00e9st a k\u00e9nyelmetlens\u00e9g\u00e9rt. Tal\u00e1n pr\u00f3b\u00e1ld \u00fajra k\u00e9s\u00f6bb. Ez az \u00fczenet \u00e1ltal\u00e1ban cs\u00facsid\u0151k\u00f6n szokott megjelenni. -tryLater=K\u00e9rj\u00fck, pr\u00f3b\u00e1lja \u00fajra k\u00e9s\u0151bb. -skipUserSingle=Skipped {0} added by {1}. -skipUserMultiple=Skipped {0} tracks added by {1}. -skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. -voteSkipAdded=Your vote has been added\! -voteSkipAlreadyVoted=You already voted to skip this track\! -voteSkipSkipping={0} have voted to skip. Skipping track {1}. -voteSkipNotEnough={0} have voted to skip. At least {1} needed. -voteSkipEmbedNoVotes=No votes to skip this track yet. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track -mathOperationResult=The result is -mathOperationDivisionByZeroError=I cannot divide by zero. -mathOperationInfinity=The number is too big to be displayed\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +permsListTitle={0} jog\u00fa felhaszn\u00e1l\u00f3k \u00e9s rangok +permsAdded=`{0}` hozz\u00e1adva a(z) `{1}` list\u00e1hoz. +permsRemoved=`{0}` elt\u00e1vol\u00edtva a(z) `{1}` list\u00e1r\u00f3l. +permsFailSelfDemotion=Ezt nem t\u00e1vol\u00edthatod el, mert admin jogosults\u00e1g n\u00e9lk\u00fcl maradn\u00e1l\! +permsAlreadyAdded={0} m\u00e1r hozz\u00e1 lett adva {1}-hez/hoz +permsNotAdded={0} nincs benne a(z) {1}-ban/ben +fuzzyMultiple=T\u00f6bb elemet tal\u00e1ltam. Ezek k\u00f6z\u00fcl keresed valamelyiket? +fuzzyNothingFound=Nothing found for `{0}`. +cmdPermsTooLow=Nincs jogod ezt a parancsot haszn\u00e1lni\! Ehhez a parancshoz legal\u00e1bb `{0}` rang kell, de neked csak `{1}` van. +playersLimited=FredBoat jelenleg maximum kihaszn\u00e1lts\u00e1gon van\! A bot most legfeljebb `{0}` \u00e9l\u0151 k\u00f6zvet\u00edt\u00e9st j\u00e1tszhat, k\u00fcl\u00f6nben megkock\u00e1ztatn\u00e1k, hogy lecsatlakozzon a Discordr\u00f3l a h\u00e1l\u00f3zat t\u00f6lt\u00f6tts\u00e9ge alatt.\nHa szeretn\u00e9l seg\u00edteni a limit n\u00f6vel\u00e9s\u00e9ben, vagy a kev\u00e9sb\u00e9 terhelt botot haszn\u00e1lni, akkor k\u00e9rlek t\u00e1mogasd a munk\u00e1nkat Patreon-on\:\n{1}\n\nEln\u00e9z\u00e9st a kellemetlens\u00e9g\u00e9rt\! Pr\u00f3b\u00e1lt \u00fajra k\u00e9s\u0151bb. Ez az \u00fczenet \u00e1ltal\u00e1ban cs\u00facsid\u0151ben jelentkezik. +tryLater=K\u00e9rj\u00fck, pr\u00f3b\u00e1ld \u00fajra k\u00e9s\u0151bb. +skipUserSingle={1} \u00e1ltal hozz\u00e1adott {0} \u00e1tugorva. +skipUserMultiple={1} \u00e1ltal hozz\u00e1adott {0} sz\u00e1m \u00e1tugorva. +skipUsersMultiple={1} felhaszn\u00e1l\u00f3 \u00e1ltal hozz\u00e1adott {0} sz\u00e1m \u00e1tugorva. +skipUserNoTracks=Az eml\u00edtett felhaszn\u00e1l\u00f3k \u00e1ltal nincs hozz\u00e1adva zenesz\u00e1m a v\u00e1r\u00f3list\u00e1n. +voteSkipAdded=A szavazatod hozz\u00e1adva\! +voteSkipAlreadyVoted=M\u00e1r szavazt\u00e1l a zenesz\u00e1m \u00e1tugr\u00e1s\u00e1r\u00f3l\! +voteSkipSkipping={0} szavazott az \u00e1tugr\u00e1sr\u00f3l. {1} \u00e1tugr\u00e1sa. +voteSkipNotEnough={0} szavazott az \u00e1tugr\u00e1sr\u00f3l. Legal\u00e1bb {1} sz\u00fcks\u00e9ges. +voteSkipEmbedNoVotes=M\u00e9g nincs szavaz\u00e1s a zenesz\u00e1m \u00e1tugr\u00e1s\u00e1r\u00f3l. +voteSkipEmbedVoters={0} a {1}-b\u00f3l/b\u0151l szavazott a jelenlegi sz\u00e1m \u00e1tugr\u00e1s\u00e1r\u00f3l +mathOperationResult=Az eredm\u00e9ny +mathOperationDivisionByZeroError=Nem tudok null\u00e1val osztani. +mathOperationInfinity=A sz\u00e1m t\u00fal nagy a megjelen\u00edt\u00e9shez\! +prefix=El\u0151tag +prefixGuild=Ezen a szerveren az el\u0151tag {0} +prefixShowAgain=B\u00e1rmikor megn\u00e9zheted az el\u0151tagot, ha megeml\u00edtesz engem. +moduleAdmin=Adminisztr\u00e1ci\u00f3 +moduleInfo=Inform\u00e1ci\u00f3 +moduleConfig=Be\u00e1ll\u00edt\u00e1sok +moduleMusic=Zene +moduleModeration=Moder\u00e1l\u00e1s +moduleUtility=Eszk\u00f6z\u00f6k +moduleFun=Sz\u00f3rakoz\u00e1s +moduleLocked=A {0} modul z\u00e1rolva van \u00e9s nem lehet enged\u00e9lyezni/letiltani. +moduleCantParse=Nincs ilyen modul. Megn\u00e9zheted az el\u00e9rhet\u0151 modulok list\u00e1j\u00e1t a(z) {0} paranccsal +moduleStatus=Modul \u00e1llapota +moduleDisable={0} modul letiltva. +moduleEnable={0} modul enged\u00e9lyezve. +moduleShowCommands=A(z) {0} parancs kilist\u00e1zza ennek a modulnak a parancsait. +modulesCommands=A(z) {0} paranccsal kilist\u00e1zhatod ennek a modulnak a parancsait, vagy a(z) {1} paranccsal az \u00f6sszes parancsot. +modulesEnabledInGuild=Enged\u00e9lyezett modulok a szerveren\: +modulesHowTo={0} paranccsal enged\u00e9lyezhetsz vagy letilthatsz modulokat. diff --git a/FredBoat/src/main/resources/lang/id_ID.properties b/FredBoat/src/main/resources/lang/id_ID.properties index 30d077cc3..9b279b387 100644 --- a/FredBoat/src/main/resources/lang/id_ID.properties +++ b/FredBoat/src/main/resources/lang/id_ID.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=Antrian lagu kosong. unpausePlayerNotPaused=Pemutar musik telah berputar. unpauseNoUsers=Tidak ada User di dalam Voice chat. unpauseSuccess=Pemutar sekarang dijalankan. -volumeApology=Maaf, Volume perintah telah dihilangkan pada Fredboat dikarenakan menyebabkan bot menghabiskan banyak waktu untuk pengolahan audio dan menyebabkan terjadinya suara terputus-putus. Disarankan menggunakan pengaturan volume pada Bot Melalui user menu https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Gunakan `;;volume <0-150>`. default volume adalah {0}%\nVolume pemutar saat ini **{1}%**. volumeSuccess=Volume dirubah dari **{0}%** ke **{1}%**. exportEmpty=Tidak ada apapun untuk dimainkan. antrian lagu kosong. @@ -127,6 +127,7 @@ luaTimeout=\ Fungsi habis \:anger\: memungkinkan perhitungan waktu {0} detik. helpSuccess=Dokumentasi telah dikirim ke pesan langsung kamu\! helpDmFailed=Tidak dapat mengirim dokumentasi ke DM Anda. Harap periksa apakah Anda tidak memilikinya dinonaktifkan\! helpCommandsPromotion=Sebut {0} untuk mempelajari apa yang dapat bot ini lakukan\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Tidak ada pengguna tersebut brainfuckCycleLimit=Program melebihi jumlah maksimum siklus {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderasi commandsMaintenance=Perbaikan commandsBotOwner=Pemilik bot commandsMoreHelp=Katakanlah {0} untuk mendapatkan informasi lebih lanjut tentang perintah tertentu +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Perintah Tidak Ditemukan. helpDocsLocation=Dokumentasi dapat ditemukan di\: helpBotInvite=Ingin menambahkan FredBoat ke server Anda? Jika Anda memiliki Server mengelola izin untuk guild, Anda dapat mengundang FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Penggunaan yang tepat\: helpCommandOwnerRestricted=Perintah ini di ban oleh pemilik bot. helpConfigCommand=Menampilkan konfig untuk server ini atau menyesuaikan setelan. helpLanguageCommand=Menampilkan bahasa yang tersedia atau menetapkan bahasa untuk server ini. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Blokir pengguna dan menghapus pesannya dari 7 hari terakhir. helpKickCommand=Menendang pengguna dari server ini. helpSoftbanCommand=Softban pengguna dengan menendang dia dan menghapus pesannya dari 7 hari terakhir. @@ -302,4 +305,20 @@ mathOperationInfinity=Angkanya terlalu besar untuk ditampilkan\! prefix=Awalan prefixGuild=Awalan untuk guild ini adalah {0} prefixShowAgain=Anda bisa menunjukkan awalan kapan saja dengan menyebutkan saya. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/it_IT.properties b/FredBoat/src/main/resources/lang/it_IT.properties index a03639529..80743d537 100644 --- a/FredBoat/src/main/resources/lang/it_IT.properties +++ b/FredBoat/src/main/resources/lang/it_IT.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=La coda di riproduzione \u00e8 vuota. unpausePlayerNotPaused=Il player non \u00e8 in pausa. unpauseNoUsers=Nessun utente nella chat vocale. unpauseSuccess=Il player non \u00e8 pi\u00f9 in pausa. -volumeApology=Mi dispiace\! Il comando ;;volume \u00e8 stato deprecato nella versione pubblica del bot musicale. Ci\u00f2 a causa del fatto che il bot impiegherebbe molto pi\u00f9 tempo a processare l'audio, per alcune tracce addirittura 5 volte tanto, con il risultato che tutti sentirebbero a scatti. Disabilitando questa funzionalit\u00e0 FredBoat pu\u00f2 riprodurre molta pi\u00f9 musica senza problemi di lag.\nE' raccomandato settare il volume del bot tramite il dropdown https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Usa `;; volume <0-150>`. {0} \u00e8 il valore di default.\nIl player \u00e8 attualmente settato a **{1}%**. volumeSuccess=Cambiato il volume da **{0}%** a **{1}%**. exportEmpty=Nulla da esportare, la coda di riproduzione \u00e8 vuota. @@ -127,6 +127,7 @@ luaTimeout=La funzione ha raggiunto il timeout \:anger\: il tempo di esecuzione helpSuccess=La documentazione ti \u00e8 stata inviata tramite un messaggio diretto\! helpDmFailed=Impossibile inviare documentazione al DM. Si prega di controllare che non li hai disabilitati\! helpCommandsPromotion=Dire {0} per imparare ci\u00f2 che FredBoat pu\u00f2 fare\! +musicCommandsPromotion=Dire {0} per vedere una lista completa dei comandi musicali. fuzzyNoResults=Nessun utente del genere brainfuckCycleLimit=Il programma ha oltrepassato il massimo numero di cicli, equivalente a {0} brainfuckDataPointerOutOfBounds=Data Pointer sforato\: {0} @@ -209,8 +210,9 @@ commandsMemes=Trend commandsUtility=Utilit\u00e0 commandsModeration=Moderazione commandsMaintenance=Manutenzione -commandsBotOwner=Proprietario di Bot +commandsBotOwner=Proprietario del Bot commandsMoreHelp=Dire {0} per ottenere ulteriori informazioni su un comando specifico. +commandsModulesHint=Puoi attivare e disattivare moduli aggiuntivi con {0} helpUnknownCommand=Comando sconosciuto. helpDocsLocation=Si puo trovare la documentazione su\: helpBotInvite=Vuoi aggiungere FredBoat al tuo server? se hai l'autorizzazione per aggiungere membri, puoi invitare FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Utilizzo corretto\: helpCommandOwnerRestricted=Questo comando \u00e8 limitato al proprietario del bot. helpConfigCommand=Visualizza la configurazione di questa gilda o regolare le impostazioni. helpLanguageCommand=Visualizzare lingue disponibili o impostare una lingua per questa gilda. +helpModules=Mostra, attiva o disattiva moduli dei comandi per questo server. helpHardbanCommand=Bandire un utente ed eliminare i suoi messaggi negli ultimi 7 giorni. helpKickCommand=Caccia un utente da questa gilda. helpSoftbanCommand=Caccia un utente e cancella i suoi messaggi dagli ultimi 7 giorni. @@ -302,4 +305,20 @@ mathOperationInfinity=Il numero \u00e8 troppo grande per essere visualizzato\! prefix=Prefisso prefixGuild=Il prefisso per questa gilda \u00e8 {0} prefixShowAgain=Puoi visualizzare il prefisso ogni volta menzionandomi. +moduleAdmin=Amministrazione +moduleInfo=Informazione +moduleConfig=Configurazione +moduleMusic=Musica +moduleModeration=Moderazione +moduleUtility=Utilit\u00e0 +moduleFun=Svago +moduleLocked=Il modulo {0} \u00e8 bloccato e non pu\u00f2 essere abilitato/disabilitato. +moduleCantParse=Nessun tale modulo. Visualizza un elenco dei moduli disponibili con {0} +moduleStatus=Stato del modulo +moduleDisable=Disattivato il modulo {0}. +moduleEnable=Attivato il modulo {0}. +moduleShowCommands=Dire {0} per visualizzare i comandi di questo modulo. +modulesCommands=Dire {0} per mostrare i comandi per un modulo, o {1} per visualizzare tutti i comandi. +modulesEnabledInGuild=Moduli abilitati per questo server\: +modulesHowTo=Dire {0} per attivare/disattivare i moduli. diff --git a/FredBoat/src/main/resources/lang/ja_JP.properties b/FredBoat/src/main/resources/lang/ja_JP.properties index d8a9e686d..8c352e80e 100644 --- a/FredBoat/src/main/resources/lang/ja_JP.properties +++ b/FredBoat/src/main/resources/lang/ja_JP.properties @@ -7,10 +7,10 @@ playSearching=`{q}`\u3092\u63a2\u3057\u3066\u3044\u307e\u3059\u3002 playYoutubeSearchError=YouTube\u3092\u691c\u7d22\u3059\u308b\u3068\u304d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u4ee3\u308f\u308a\u306b\u30aa\u30fc\u30c7\u30a3\u30aa \u30bd\u30fc\u30b9\u306b\u76f4\u63a5\u30ea\u30f3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002```\n ;;play ``` playSearchNoResults=`{q}`\u306e\u691c\u7d22\u7d50\u679c\u304c\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002 playSelectVideo=** ` {0} play 1-5`\u30b3\u30de\u30f3\u30c9\u3067\u66f2\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\uff1a** -joinJoining={0} \u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\u3002 +joinJoining={0} \u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u3059 joinErrorAlreadyJoining=\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002Fredboat\u306f\u3059\u3067\u306b\u305d\u306e\u30c1\u30e3\u30cd\u30eb\u306b\u63a5\u7d9a\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u308b\u306e\u3067\u3001{0} \u306b\u306f\u53c2\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 pauseAlreadyPaused=\u30d7\u30ec\u30fc\u30e4\u30fc\u306f\u65e2\u306b\u4e00\u6642\u505c\u6b62\u3057\u3066\u3044\u307e\u3059\u3002 -pauseSuccess=\u30d7\u30ec\u30a4\u30e4\u30fc\u306f\u3053\u306e\u4e00\u6642\u505c\u6b62\u3067\u3059\u3002''{0}unpause'' \u3067\u518d\u958b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 +pauseSuccess=\u30d7\u30ec\u30a4\u30e4\u30fc\u306f\u4e00\u6642\u505c\u6b62\u3057\u307e\u3057\u305f\u3002`{0}unpause` \u3067\u518d\u958b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 repeatOnSingle=\u3053\u306e\u30c8\u30e9\u30c3\u30af\u306f\u4eca\u30ea\u30d4\u30fc\u30c8\u4e2d\u3067\u3059\u3002 repeatOnAll=\u30d7\u30ec\u30fc\u30e4\u30fc\u306f\u30ad\u30e5\u30fc\u3092\u7e70\u308a\u8fd4\u3057\u307e\u3059\u3002 repeatOff=\u30d7\u30ec\u30fc\u30e4\u30fc\u306f\u30ea\u30d4\u30fc\u30c8\u518d\u751f\u3092\u3084\u3081\u307e\u3057\u305f\u3002 @@ -24,21 +24,21 @@ reshufflePlayerNotShuffling=\u307e\u305a\u3001\u30b7\u30e3\u30c3\u30d5\u30eb \u3 skipEmpty=\u30ad\u30e5\u30fc\u306b\u4f55\u3082\u3042\u308a\u307e\u305b\u3093\uff01 skipOutOfBounds={1} \u30c8\u30e9\u30c3\u30af\u304c\u304c\u3042\u308b\u3068\u304d\u306f\u3001\u30c8\u30e9\u30c3\u30af\u756a\u53f7 {0} \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3002 skipNumberTooLow=\u4e0e\u3048\u3089\u308c\u305f\u756a\u53f7\u306f0\u3088\u308a\u5927\u304d\u3044\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff01 -skipSuccess=\u30c8\u30e9\u30c3\u30af \#{0} \u3092\u30b9\u30ad\u30c3\u30d7\: * *{1} * * +skipSuccess=\u30c8\u30e9\u30c3\u30af \#{0} \u3092\u30b9\u30ad\u30c3\u30d7\: **{1}** skipRangeInvalid=\u6307\u5b9a\u3057\u305f\u30c8\u30e9\u30c3\u30af\u306e\u7bc4\u56f2\u306f\u7121\u52b9\u3067\u3059\u3002 skipRangeSuccess=\#{0}\u3000\u304b\u3089\u3000\#{1}\u3000\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 skipTrackNotFound=\u30b9\u30ad\u30c3\u30d7\u3059\u308b\u30c8\u30e9\u30c3\u30af\u3092\u898b\u3064\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 -stopAlreadyEmpty=\u30ad\u30e5\u30fc\u306f\u3059\u3067\u306b\u7a7a\u3067\u3059 -stopEmptyOne=\u30ad\u30e5\u30fc\u306f\u7a7a\u306b\u306a\u308a\u307e\u3057\u305f\u3001'1' \u306e\u30c8\u30e9\u30c3\u30af\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 +stopAlreadyEmpty=\u30ad\u30e5\u30fc\u306f\u3059\u3067\u306b\u7a7a\u3067\u3059\u3002 +stopEmptyOne=\u30ad\u30e5\u30fc\u306f\u7a7a\u306b\u306a\u308a\u307e\u3057\u305f\u3001`1` \u306e\u30c8\u30e9\u30c3\u30af\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 stopEmptySeveral=\u30ad\u30e5\u30fc\u304c\u7a7a\u306b\u306a\u308a\u307e\u3057\u305f\u3001''{0}'' \u30c8\u30e9\u30c3\u30af\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 stopAccessDenied=\u4e71\u7528\u3092\u9632\u3050\u305f\u3081\u3001\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306f\u3001\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u7ba1\u7406\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u6a29\u9650\u306e\u6240\u6301\u8005\u306e\u307f\u304c\u3001\u4f7f\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 unpauseQueueEmpty=\u30ad\u30e5\u30fc\u306b\u4f55\u3082\u3042\u308a\u307e\u305b\u3093\u3002 unpausePlayerNotPaused=\u30d7\u30ec\u30fc\u30e4\u30fc\u306f\u4e00\u6642\u505c\u6b62\u3057\u3066\u3044\u307e\u305b\u3093\u3002 unpauseNoUsers=\u30dc\u30a4\u30b9\u30c1\u30e3\u30f3\u30cd\u30eb\u306b\u8ab0\u3082\u3044\u307e\u305b\u3093\u3002 unpauseSuccess=\u30d7\u30ec\u30fc\u30e4\u30fc\u306f\u73fe\u5728\u4e00\u6642\u505c\u6b62\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -volumeApology=\u7533\u3057\u8a33\u3054\u3056\u3044\u307e\u305b\u3093\u3002;;volume \u30b3\u30de\u30f3\u30c9\u306f\u3001\u901a\u5e38\u306e\u4e94\u500d\u4ee5\u4e0a\u306e\u51e6\u7406\u6642\u9593\u304c\u304b\u304b\u308b\u305f\u3081\u3001\u516c\u5171\u306e\u97f3\u697dBot\u306b\u306f\u63a8\u5968\u3057\u3066\u3044\u307e\u305b\u3093\u3002\u3053\u306e\u6a5f\u80fd\u3092\u7121\u52b9\u306b\u3059\u308b\u3068\u3001FredBoat \u306f\u30e9\u30b0\u306a\u3057\u3067\u3001\u591a\u304f\u306e\u97f3\u697d\u3092\u518d\u751f\u3067\u304d\u307e\u3059\u3002\u30c9\u30ed\u30c3\u30d7\u30c0\u30a6\u30f3\u30e1\u30cb\u30e5\u30fc\u3092\u4f7f\u3063\u3066\u3001Bot\u306e\u97f3\u91cf\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002\nhttps\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=;volume <0-150>''. {0}% \u304c\u30c7\u30d5\u30a9\u30eb\u30c8\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u30d7\u30ec\u30fc\u30e4\u30fc\u306f\u73fe\u5728\u3001* *{1}% * *\u3002 -volumeSuccess=\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u5909\u66f4\u306f * *{0}% * \u304b\u3089 * *{1}% * *\u3002 +volumeSuccess=\u30dc\u30ea\u30e5\u30fc\u30e0\u3092**{0}%**\u304b\u3089**{1}%**\u3078\u5909\u66f4\u3057\u307e\u3057\u305f\u3002 exportEmpty=\u4f55\u3082\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002\u30ad\u30e5\u30fc\u304c\u7a7a\u3067\u3059\u3002 exportPlaylistResulted=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u305f\u518d\u751f\u30ea\u30b9\u30c8\: {0} \u3002\u5f8c\u3067\u3053\u306e URL \u3092\u4f7f\u3046\u3068\u73fe\u5728\u306e\u30d7\u30ec\u30a4\u30ea\u30b9\u30c8\u3092\u518d\u751f\u3059\u308b\u3053\u3068\u304c\u304d\u307e\u3059\u3002 exportPlaylistFail=Hastebin.com \u306b\u30d7\u30ec\u30a4\u30ea\u30b9\u30c8\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 @@ -49,7 +49,7 @@ listShowHistory=\u5c65\u6b74\u306b\u30c8\u30e9\u30c3\u30af\u3092\u8868\u793a\u30 listAddedBy=** {0} ** ** ** {1} ** ''[ {2} ] \u306b\u3088\u3063\u3066\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f listStreamsOnlySingle=\u30ad\u30e5\u30fc\u306b** {0} **\u30e9\u30a4\u30d6{1} \u304c\u3042\u308a\u307e\u3059\u3002 listStreamsOnlyMultiple=* *{0} * * \u306f {1} \u30ad\u30e5\u30fc\u3067\u30e9\u30a4\u30d6\u3067\u3059\u3002 -listStreamsOrTracksSingle={3} \u30ad\u30e5\u30fc\u306b * *{0} * * {1} \u306f\u3042\u3068\u6b8b\u308a\u306e\u9577\u3055 * * [{2}] * * \u3002 +listStreamsOrTracksSingle={3} \u30ad\u30e5\u30fc\u306b * *{0} * * {1} \u500b\u306e\u30c8\u30e9\u30c3\u30af\u304c\u3042\u308a\u3001\u6b8b\u308a\u306e\u9577\u3055\u306f * * [{2}] * * \u3067\u3059\u3002 listStreamsOrTracksMultiple={3} \u30ad\u30e5\u30fc\u306b * *{0} * * {1} \u306f\u3042\u3068\u6b8b\u308a\u306e\u9577\u3055 * * [{2}] * * \u3002 streamSingular=\u30b9\u30c8\u30ea\u30fc\u30e0 streamPlural=\u30b9\u30c8\u30ea\u30fc\u30e0 @@ -78,16 +78,16 @@ fwdSuccess={1} \u3092\u8ee2\u9001 * *{0} * * \u3002 restartSuccess=* *{0} * * \u518d\u958b\u3057\u307e\u3057\u305f\u3002 queueEmpty=\u30ad\u30e5\u30fc\u306b\u4f55\u3082\u3042\u308a\u307e\u305b\u3093\u3002 rewSuccess=\u5dfb\u304d\u623b\u3057 * *{0} * * {1} \u3067\u3002 -seekSuccess=\u6c42\u3081\u3066 * *{0} * * {1} \u306b\u3002 +seekSuccess=**{0}**\u3092{1} \u306b\u30b7\u30fc\u30af\u3057\u307e\u3057\u305f\u3002 seekDeniedLiveTrack=\u30e9\u30a4\u30d6\u30c8\u30e9\u30c3\u30af\u3092\u63a2\u3059\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 loadPlaySplitListFail=\u305d\u306e\u30ea\u30f3\u30af\u306f\u306a\u3044\u30c8\u30e9\u30c3\u30af\u306e\u518d\u751f\u30ea\u30b9\u30c8\u306b \u306a\u3063\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u5834\u5408\u3000;;play\u306e\u4f7f\u3063\u3066\u304f\u3060\u3055\u3044\u3002 loadListSuccess=\u30d7\u30ec\u30a4\u30ea\u30b9\u30c8\u304b\u3089\u66f2 ''{0}'' \u3092\u8ffd\u52a0 * *{1} * *\u3002 -loadNoMatches=''{0}'' \u306e\u30aa\u30fc\u30c7\u30a3\u30aa\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002 -loadSplitNotYouTube=\u3053\u308c\u306f YouTube \u306e\u30c8\u30e9\u30c3\u30af\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002YouTube \u30c8\u30e9\u30c3\u30af\u306e\u307f\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u3001';split\u306e\u30b3\u30de\u30f3\u30c9\u3002;;play \u3092\u4f7f\u7528\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044;;split \u306e\u4ee3\u308f\u308a\u306b\u3002 +loadNoMatches=`{0}`\u306e\u30aa\u30fc\u30c7\u30a3\u30aa\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +loadSplitNotYouTube=\u3053\u308c\u306fYouTube\u306e\u30c8\u30e9\u30c3\u30af\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002`;;split`\u306fYouTube\u306e\u30c8\u30e9\u30c3\u30af\u3067\u306e\u307f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u3002`;;play`\u3092\u4f7f\u7528\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002 loadSplitNotResolves=\u305d\u306e\u52d5\u753b\u306e\u53ce\u9332\u66f2\u3092\u89e3\u6c7a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002;;play \u3092\u4f7f\u7528\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u4ee3\u308f\u308a\u306b\u3002 loadFollowingTracksAdded=\u6b21\u306e\u30c8\u30e9\u30c3\u30af\u306b\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 -loadPlaylistTooMany=\u8ffd\u52a0\u306e {0} \u30c8\u30e9\u30c3\u30af\u3002\u8868\u793a\u3059\u308b\u306e\u306b\u3042\u307e\u308a\u306b\u3082\u591a\u304f\u306e\u30c8\u30e9\u30c3\u30af\u3092\u767a\u898b\u3057\u307e\u3057\u305f\u3002 -loadErrorCommon=''{0}''\:{1} \u306e\u60c5\u5831\u3092\u8aad\u307f\u8fbc\u3080\u3068\u304d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +loadPlaylistTooMany={0} \u30c8\u30e9\u30c3\u30af\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f\u3002\u591a\u3044\u306e\u3067\u8868\u793a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +loadErrorCommon=`{0}`\: \u306e\u60c5\u5831\u3092\u8aad\u307f\u8fbc\u3080\u3068\u304d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\n{1} loadErrorSusp=''{0}''\u306e\u60c5\u5831\u3092\u30ed\u30fc\u30c9\u3059\u308b\u3068\u304d\u306b\u4e0d\u5be9\u306a\u30a8\u30e9\u30fc\u304c\u767a\u751f \u3002 loadQueueTrackLimit=\u4e71\u7528\u9632\u6b62\u306e\u305f\u3081\u3001{0} \u30c8\u30e9\u30c3\u30af\u4ee5\u4e0a\u3001\u30ad\u30e5\u30fc\u306b\u30c8\u30e9\u30c3\u30af\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\! loadAnnouncePlaylist=\u30d7\u30ec\u30a4\u30ea\u30b9\u30c8 * *{0} * * ( ''{1}'' \u30c8\u30e9\u30c3\u30af) \u3092\u30ed\u30fc\u30c9\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u306f\u3001\u3057\u3070\u3089\u304f\u6642\u9593\u304c\u304b\u304b\u308a\u307e\u3059\u3002\u3054\u4e86\u627f\u304f\u3060\u3055\u3044\u3002 @@ -127,6 +127,7 @@ luaTimeout=\ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u307e\u3057\u305f \:ange helpSuccess=\u30d8\u30eb\u30d7\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092DM\u3067\u9001\u308a\u307e\u3057\u305f\u3002 helpDmFailed=DM\u306b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3042\u306a\u305f\u306f\u305d\u308c\u3089\u304c\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\uff01 helpCommandsPromotion={0} \u3068\u767a\u8a00\u3057\u3066\u3001\u3053\u306eBot\u306b\u4f55\u304c\u3067\u304d\u308b\u306e\u304b\u3092\u77e5\u308a\u307e\u3057\u3087\u3046\uff01 +musicCommandsPromotion=\u97f3\u697d\u30b3\u30de\u30f3\u30c9\u306e\u5b8c\u5168\u306a\u30ea\u30b9\u30c8\u3092\u898b\u308b\u306b\u306f{0} \u3068\u8a00\u3063\u3066\u304f\u3060\u3055\u3044\u3002 fuzzyNoResults=\u305d\u306e\u30e6\u30fc\u30b6\u30fc\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 brainfuckCycleLimit=\u30d7\u30ed\u30b0\u30e9\u30e0\u304c{0} \u306e\u6700\u5927\u30b5\u30a4\u30af\u30eb\u6570\u3092\u8d85\u3048\u307e\u3057\u305f brainfuckDataPointerOutOfBounds=\u7bc4\u56f2\u5916\u306e\u30c7\u30fc\u30bf\u30dd\u30a4\u30f3\u30bf\uff1a{0} @@ -211,6 +212,7 @@ commandsModeration=\u7ba1\u7406 commandsMaintenance=\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9 commandsBotOwner=bot\u306e\u30aa\u30fc\u30ca\u30fc commandsMoreHelp={0} \u3068\u767a\u8a00\u3059\u308b\u3053\u3068\u3067\u3001\u7279\u5b9a\u306e\u30b3\u30de\u30f3\u30c9\u306b\u3064\u3044\u3066\u306e\u60c5\u5831\u3092\u8a73\u3057\u304f\u8868\u793a\u3067\u304d\u307e\u3059\u3002 +commandsModulesHint={0} \u3067\u8ffd\u52a0\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u6709\u52b9\u307e\u305f\u306f\u7121\u52b9\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 helpUnknownCommand=\u4e0d\u660e\u306a\u30b3\u30de\u30f3\u30c9\u3002 helpDocsLocation=\u4ed5\u69d8\u66f8\u306f\u3053\u3061\u3089\: helpBotInvite=Fredboat\u3092\u3042\u306a\u305f\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u8ffd\u52a0\u3057\u305f\u3044\u3067\u3059\u304b\uff1f\u3082\u3057\u3042\u306a\u305f\u304c\u30b5\u30fc\u30d0\u30fc\u306e\u7ba1\u7406\u306e\u6a29\u9650\u3092\u304a\u6301\u3061\u3067\u3057\u305f\u3089\u3001\u3053\u3061\u3089\u304b\u3089Fredboat\u3092\u62db\u5f85\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\: @@ -222,6 +224,7 @@ helpProperUsage=\u9069\u5207\u306a\u4f7f\u7528\u65b9\u6cd5\: helpCommandOwnerRestricted=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306fbot\u306e\u30aa\u30fc\u30ca\u30fc\u306b\u3088\u3063\u3066\u5236\u9650\u3055\u308c\u3066\u3044\u307e\u3059\u3002 helpConfigCommand=\u3053\u306e\u30ae\u30eb\u30c9\u306e\u69cb\u6210\u3092\u8868\u793a\u3057\u305f\u308a\u3001\u8a2d\u5b9a\u3092\u8abf\u6574\u3057\u307e\u3059\u3002 helpLanguageCommand=\u5229\u7528\u53ef\u80fd\u306a\u8a00\u8a9e\u3092\u8868\u793a\u3001\u307e\u305f\u306f\u3053\u306e\u30ae\u30eb\u30c9\u306e\u8a00\u8a9e\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002 +helpModules=\u3053\u306e\u30ae\u30eb\u30c9\u306e\u30b3\u30de\u30f3\u30c9\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8868\u793a\u3001\u6709\u52b9\u307e\u305f\u306f\u7121\u52b9\u306b\u3057\u307e\u3059\u3002 helpHardbanCommand=\u30e6\u30fc\u30b6\u30fc\u3092BAN\u3057\u3066\u3001\u305d\u306e\u4eba\u306e\u76f4\u8fd1\u4e00\u9031\u9593\u306e\u767a\u8a00\u3092\u524a\u9664\u3057\u307e\u3059\u3002 helpKickCommand=\u3053\u306e\u30ae\u30eb\u30c9\u304b\u3089\u30e6\u30fc\u30b6\u30fc\u3092\u30ad\u30c3\u30af\: helpSoftbanCommand=\u30e6\u30fc\u30b6\u30fc\u3092Softban\u3057\u3066\u3001\u305d\u306e\u4eba\u306e\u76f4\u8fd1\u4e00\u9031\u9593\u306e\u767a\u8a00\u3092\u524a\u9664\u3057\u307e\u3059\u3002 @@ -302,4 +305,20 @@ mathOperationInfinity=\u6570\u5b57\u304c\u5927\u304d\u3059\u304e\u3066\u8868\u79 prefix=\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9 prefixGuild=\u3053\u306e\u30ae\u30eb\u30c9\u306e\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u306f {0} prefixShowAgain=\u79c1\u306b\u8a00\u53ca\u3001\u3044\u3064\u3067\u3082\u518d\u3073\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002 +moduleAdmin=\u7ba1\u7406 +moduleInfo=\u30a4\u30f3\u30d5\u30a9\u30e1\u30fc\u30b7\u30e7\u30f3 +moduleConfig=\u8a2d\u5b9a +moduleMusic=\u97f3\u697d +moduleModeration=\u30e2\u30c7\u30ec\u30fc\u30bf\u30fc +moduleUtility=\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3 +moduleFun=\u697d\u3057\u3044 +moduleLocked={0} \u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30ed\u30c3\u30af\u3055\u308c\u3066\u304a\u308a\u3001\u7121\u52b9/\u6709\u52b9\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 +moduleCantParse=\u305d\u306e\u3088\u3046\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u3042\u308a\u307e\u305b\u3093\u3002{0} \u3067\u5229\u7528\u53ef\u80fd\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30ea\u30b9\u30c8\u3092\u8868\u793a\u3059\u308b +moduleStatus=\u30e2\u30b8\u30e5\u30fc\u30eb\u30b9\u30c6\u30fc\u30bf\u30b9 +moduleDisable=\u7121\u52b9\u306a\u30e2\u30b8\u30e5\u30fc\u30eb{0} \u3067\u3059\u3002 +moduleEnable=\u6709\u52b9\u306a\u30e2\u30b8\u30e5\u30fc\u30eb{0} \u3002 +moduleShowCommands={0} \u3068\u8a00\u3063\u3066\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30b3\u30de\u30f3\u30c9\u3092\u898b\u3066\u304f\u3060\u3055\u3044\u3002 +modulesCommands=\u8a00\u3046{0} \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u305f\u3081\u306e\u30b3\u30de\u30f3\u30c9\u3092\u8868\u793a\u3059\u308b\u3001\u307e\u305f\u306f{1} \u3059\u3079\u3066\u306e\u30b3\u30de\u30f3\u30c9\u3092\u8868\u793a\u3057\u307e\u3059\u3002 +modulesEnabledInGuild=\u3053\u306e\u30ae\u30eb\u30c9\u306e\u305f\u3081\u306e\u6709\u52b9\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\uff1a +modulesHowTo={0} \u3068\u8a00\u3063\u3066\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u6709\u52b9/\u7121\u52b9\u306b\u3057\u307e\u3059\u3002 diff --git a/FredBoat/src/main/resources/lang/ko_KR.properties b/FredBoat/src/main/resources/lang/ko_KR.properties index aa86db800..16402c96a 100644 --- a/FredBoat/src/main/resources/lang/ko_KR.properties +++ b/FredBoat/src/main/resources/lang/ko_KR.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=\uc7ac\uc0dd \ud050\uac00 \ube44\uc5b4\uc788\uc2b5\ub2c8\ub2e4 unpausePlayerNotPaused=\ud50c\ub808\uc774\uc5b4\uac00 \uc77c\uc2dc\uc815\uc9c0 \ub41c \uc0c1\ud0dc\uac00 \uc544\ub2d9\ub2c8\ub2e4. unpauseNoUsers=\ud604\uc7ac \uc74c\uc131\ucc44\ub110\uc5d0 \uc811\uc18d\ud574 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc870\uc791\uc744 \uc704\ud574\uc11c\ub294 \uba3c\uc800 \uc74c\uc131\ucc44\ub110\uc5d0 \uc811\uc18d\ud574\uc57c \ud569\ub2c8\ub2e4. unpauseSuccess=\ud50c\ub808\uc774\uc5b4\uc758 \uc77c\uc2dc\uc815\uc9c0\uac00 \ud574\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. -volumeApology=\uc8c4\uc1a1\ud569\ub2c8\ub2e4. ;;volume \uba85\ub839\uc5b4\ub294 \uacf5\uc2dd \uc74c\uc545 \ubd07\uc5d0\uc11c \ube44\ud65c\uc131\ud654 \ub418\uc5b4\uc788\uc2b5\ub2c8\ub2e4. \ubcfc\ub968 \uc870\uc808 \uae30\ub2a5\uc73c\ub85c \uc778\ud574 \uc624\ub514\uc624\ub97c \ucc98\ub9ac\ud558\ub294\ub370\uc5d0 \ub108\ubb34 \ub9ce\uc740 \uc2dc\uc2a4\ud15c \uc790\uc6d0\uc744 \uc18c\ube44\ud558\uc5ec \uc77c\ubd80 \uc720\uc800\uac00 \ub04a\uae40 \ud604\uc0c1\uc744 \uacaa\ub294 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\uac00 \uc788\uc5b4 \uc6d0\ud65c\ud55c \ubd07 \uc6b4\uc601\uc744 \uc704\ud574 \uc5b4\uca54\uc218\uc5c6\uc774 \ube44\ud65c\uc131\ud654 \ud558\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\ub2e4\ub9cc \ubd07 \ud504\ub85c\ud544\uc744 \uc624\ub978\ucabd \ud074\ub9ad\ud558\uc5ec \uc0ac\uc6a9\uc790 \ubcfc\ub968\uc744 \uc870\uc808\ud558\ub294 \ubc29\ubc95\uc73c\ub85c \ubcfc\ub968 \uc870\uc808\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4. https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\uc0ac\uc6a9\ubc29\ubc95 \: `;;volume <0-150>`.\n\uae30\ubcf8 \ubcfc\ub968\uc740 {0}% \uc785\ub2c8\ub2e4.\n\ud604\uc7ac \ubcfc\ub968 \: **{1}%** volumeSuccess=\ubcfc\ub968\uc744 \uc870\uc808\ud569\ub2c8\ub2e4 [**{0}%**] \:arrow_right\: [**{1}%**]. exportEmpty=\uacf5\uc720\ud560 \uace1\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uc7ac\uc0dd \ud050\uac00 \ube44\uc5b4\uc788\uc2b5\ub2c8\ub2e4. @@ -127,6 +127,7 @@ luaTimeout=\uae30\ub2a5 \uc2dc\uac04 \ucd08\uacfc \: \ubd84\ub178 \: \ud5c8\uc6a helpSuccess=\uc9c1\uc811 \uba54\uc2dc\uc9c0\ub85c \ubb38\uc11c\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4. helpDmFailed=\ub2f9\uc2e0\uc758 DMs\uc5d0 \ubb38\uc11c\ub97c \ubcf4\ub0bc \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2f9\uc2e0\uc774 \uadf8 \uae30\ub2a5\uc744 \uaebc\ub193\uc558\ub294\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624 helpCommandsPromotion={0} \ub97c \ub9d0\ud558\uc5ec \uc774 \ubd07\uc774 \ubb34\uc5c7\uc744 \ud560 \uc218 \uc788\ub294\uc9c0 \ubc30\uc6cc\ubcf4\uc138\uc694\! +musicCommandsPromotion=\uc74c\uc545 \uba85\ub839\uc5b4 \ubaa9\ub85d\uc744 \ubcf4\ub824\uba74 {0} \ub97c \uc785\ub825\ud558\uc138\uc694. fuzzyNoResults=\uadf8\ub7f0 \uc0ac\uc6a9\uc790\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. brainfuckCycleLimit=\ud504\ub85c\uadf8\ub7a8\uc774 {0}\uc758 \ucd5c\ub300 \uc21c\ud658 \ud69f\uc218\ub97c \ucd08\uacfc\ud588\uc2b5\ub2c8\ub2e4. brainfuckDataPointerOutOfBounds=\ub370\uc774\ud130 \ud3ec\uc778\ud130\uac00 \ubc94\uc704\ub97c \ubc97\uc5b4\ub0a8 \: {0} @@ -211,6 +212,7 @@ commandsModeration=\uc81c\uc81c. commandsMaintenance=\uc810\uac80 commandsBotOwner=\ubd07 \uc8fc\uc778 commandsMoreHelp={0} \uc744 \ub9d0\ud558\uc5ec \ud2b9\uc815 \uba85\ub839\uc5b4\uc5d0 \ub300\ud55c \ub354 \ub9ce\uc740\uac83\uc744 \uc54c\uc544\ubcf4\uc138\uc694. +commandsModulesHint={0} \ub97c \uc774\uc6a9\ud574 \ucd94\uac00\uc801\uc778 \ubaa8\ub4c8\uc744 \ud65c\uc131\ud654\ud558\uac70\ub098 \ube44\ud65c\uc131\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. helpUnknownCommand=\uc54c \uc218 \uc5c6\ub294 \uba85\ub839\uc5b4\uc785\ub2c8\ub2e4. helpDocsLocation=\ubb38\uc11c\ub97c \uc774\uacf3\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4\: helpBotInvite=FredBoat\ub97c \ub2f9\uc2e0\uc758 \uc11c\ubc84\uc5d0 \ucd94\uac00\ud558\uae30\ub97c \uc6d0\ud558\uc2dc\ub098\uc694? \uc11c\ubc84 \uad00\ub9ac\uc790 \uad8c\ud55c\uc774 \uc788\ub2e4\uba74, FredBoat\ub97c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\: @@ -222,6 +224,7 @@ helpProperUsage=\uc815\ud655\ud55c \uc0ac\uc6a9\ubc95\: helpCommandOwnerRestricted=\uc774 \uba85\ub839\uc5b4\ub294 \ubd07 \uc8fc\uc778\ub9cc \uc0ac\uc6a9 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. helpConfigCommand=\uc774 \uae38\ub4dc\uc758 \uc124\uc815\uc744 \ubcf4\uc57c\uc8fc\uac70\ub098 \uc124\uc815\uc744 \uc870\uc885 \ud558\uc138\uc694. helpLanguageCommand=\uc0ac\uc6a9 \ud560 \uc218 \uc788\ub294 \uc5b8\uc5b4\ub4e4\uc744 \ubcf4\uc5ec\uc8fc\uac70\ub098 \uc774 \uae38\ub4dc\ub97c \uc704\ud55c \uc5b8\uc5b4\ub97c \uacb0\uc815\ud558\uc138\uc694. +helpModules=\uc774 \uae38\ub4dc\uc758 \ud65c\uc131\ud654\ud560 \uc218 \uc788\uac70\ub098 \ube44\ud65c\uc131\ud654\ud560 \uc218 \uc788\ub294 \uba85\ub839\uc5b4 \ubaa8\ub4c8\uc744 \ud655\uc778\ud569\ub2c8\ub2e4. helpHardbanCommand=\uc0ac\uc6a9\uc790\ub97c \ucc28\ub2e8\ud558\uace0 \uc9c0\ub09c 7\uc77c\uac04 \uadf8\uc758 \uba54\uc138\uc9c0\ub97c \uc0ad\uc81c\ud569\ub2c8\ub2e4. helpKickCommand=\uc0ac\uc6a9\uc790\ub97c \uc774 \uae38\ub4dc\uc5d0\uc11c \ucd94\ubc29\ud558\uc600\uc2b5\ub2c8\ub2e4. helpSoftbanCommand=\uc720\uc800\ub97c \ucd94\ubc29\ud558\uace0 7\uc77c\ub3d9\uc548\uc758 \uba54\uc2dc\uc9c0\ub97c \uc0ad\uc81c \ud558\uc5ec \uc18c\ud504\ud2b8\ubc34\uc744 \ud569\ub2c8\ub2e4. @@ -302,4 +305,20 @@ mathOperationInfinity=\ud574\ub2f9 \uc22b\uc790\ub294 \ubcf4\uc5ec\uc8fc\uae30\u prefix=\uc811\ub450\uc0ac prefixGuild=\uc774 \uc11c\ubc84\uc758 \uc811\ub450\uc0ac\ub294 {0} \uc785\ub2c8\ub2e4. prefixShowAgain=\uc800\ub97c \uc5b8\uae09\ud558\uc5ec \uc5b8\uc81c\ub4e0\uc9c0 \uc811\ub450\uc0ac\ub97c \ud45c\uc2dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. +moduleAdmin=\uad00\ub9ac +moduleInfo=\uc815\ubcf4 +moduleConfig=\ud658\uacbd\uc124\uc815 +moduleMusic=\uc74c\uc545 +moduleModeration=\uc870\uc815 +moduleUtility=\uc720\ud2f8\ub9ac\ud2f0 +moduleFun=\uc7ac\ubbf8 +moduleLocked={0} \ubaa8\ub4c8\uc740 \uc7a0\uaca8\uc788\uc5b4 \ud65c\uc131\ud654\ud558\uac70\ub098 \ube44\ud65c\uc131\ud654\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +moduleCantParse=\uadf8\ub7f0 \ubaa8\ub4c8\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. {0} \ub85c \uc0ac\uc6a9\uac00\ub2a5\ud55c \ubaa8\ub4c8 \ubaa9\ub85d\uc744 \ud655\uc778\ud574 \uc8fc\uc138\uc694. +moduleStatus=\ubaa8\ub4c8 \uc0c1\ud0dc +moduleDisable=\ube44\ud65c\uc131\ud654 \ub41c \ubaa8\ub4c8 {0}. +moduleEnable=\ud65c\uc131\ud654 \ub41c \ubaa8\ub4c8 {0}. +moduleShowCommands=\uc774 \ubaa8\ub4c8\uc758 \uba85\ub839\uc5b4\ub97c \ubcf4\ub824\uba74 {0} \ub97c \uc785\ub825\ud558\uc138\uc694. +modulesCommands={0} \ub97c \uc785\ub825\ud574 \ud55c \ubaa8\ub4c8\uc758 \uba85\ub839\uc5b4\ub97c \ud655\uc778\ud558\uac70\ub098 {1} \ub97c \uc785\ub825\ud574 \ubaa8\ub4e0 \uba85\ub839\uc5b4\ub97c \ud655\uc778\ud558\uc138\uc694. +modulesEnabledInGuild=\uc774 \uae38\ub4dc\uc5d0\uc11c \ud65c\uc131\ud654\ub41c \ubaa8\ub4c8\: +modulesHowTo={0} \ub97c \uc785\ub825\ud574 \ubaa8\ub4c8\uc744 \ud65c\uc131\ud654\ud558\uac70\ub098 \ube44\ud65c\uc131\ud654\ud569\ub2c8\ub2e4. diff --git a/FredBoat/src/main/resources/lang/ms_MY.properties b/FredBoat/src/main/resources/lang/ms_MY.properties index e8a64d93e..6ff95977e 100644 --- a/FredBoat/src/main/resources/lang/ms_MY.properties +++ b/FredBoat/src/main/resources/lang/ms_MY.properties @@ -1,305 +1,324 @@ #X-Generator: crowdin.com -playQueueEmpty=Pemain lagu tidak memainkan apa-apa. Sila gunakan sintax berikut untuk menambah lagu\:\n;;play -playAlreadyPlaying=Pemain sudah memainkan lagu. -playVCEmpty=Tiada pengguna terdapat dalam bilik borak suara. +playQueueEmpty=Pemain tidak memainkan apa-apa. Sila gunakan sintaks berikut untuk menambah lagu\:\n;;play +playAlreadyPlaying=Pemain memang sedang memainkan lagu. +playVCEmpty=Tiada pengguna dalam sembang suara. playWillNowPlay=Pemain akan bermain sekarang. -playSearching=Mencari ''{q}'' di YouTube... -playYoutubeSearchError=Terdapat ralat ketika mencari di YouTube. Sebaliknya, timbangkan untuk menampal pautan terus ke sumber-sumber audio.\n```;;play ``` +playSearching=Mencari `{q}` di YouTube... +playYoutubeSearchError=Terdapat ralat ketika mencari di YouTube. Sila pertimbangkan untuk menampal pautan terus ke sumber audio.\n```\n;;play ``` playSearchNoResults=Tiada keputusan untuk `{q}` -playSelectVideo=**Sila pilih lagu dengan perintah `{0}play n`\:** -joinJoining=Menyertai {0} -joinErrorAlreadyJoining=Satu ralat telah berlaku. Tidak dapat menyertai {0} kerana saya telah cuba untuk menyambung ke saluran itu. Sila cuba lagi. -pauseAlreadyPaused=Pemain telah dihentikan sementara. -pauseSuccess=Pemain sedang dihentikan sementara. Anda boleh mainkan semula dengan ''{0}main''. -repeatOnSingle=Pemain akan mengulang semula trek semasa. -repeatOnAll=Pemain akan mengulang semula aturan. -repeatOff=Pemain tidak akan lagi mengulang. -selectSuccess=Lagu **\#{0} ** telah dipilih\: **{1} ** ({2}) -selectInterval=Mestilah nombor 1-{0}. -selectSelectionNotGiven=Anda mesti terlebih dahulu diberi pilihan untuk memilih. -shuffleOn=Pemain sekarang akan 'shuffled'. -shuffleOff=Pemain sekarang tidak lagi 'shuffled'. -reshufflePlaylist=Aturan telah di'shuffle' semula. -reshufflePlayerNotShuffling=Anda mesti menghidupkan mod 'shuffle'. -skipEmpty=Aturan masih kosong\! -skipOutOfBounds=Tidak dapat mengalih keluar {0} nombor aturan apabila terdapat hanya {1} aturan. +playSelectVideo=**Sila pilih lagu dengan perintah `{0}play 1-5`\:** +joinJoining=Sedang masuk ke {0} +joinErrorAlreadyJoining=Telah berlakunya ralat. Saya tidak boleh masuk ke {0} kerana saya memang sedang menyambung ke saluran itu. Sila cuba lagi. +pauseAlreadyPaused=Pemain telah dijedakan. +pauseSuccess=Pemain kini dijedakan. Anda boleh sambung semula dengan `{0}unpause`. +repeatOnSingle=Pemain akan mengulang semula lagu semasa. +repeatOnAll=Pemain akan mengulang semula senarai menunggu. +repeatOff=Pemain tidak akan mengulang lagu selepas ini. +selectSuccess=Lagu **\#{0}** telah dipilih\: **{1}** ({2}) +selectInterval=Nombor mesti di antara 1-{0}. +selectSelectionNotGiven=Anda mesti diberi pilihan dahulu sebelum anda boleh memilih nombor lagu. +shuffleOn=Pemain akan dikocok sekarang. +shuffleOff=Pemain sudah tidak dikocok. +reshufflePlaylist=Senarai menunggu telah dikocok semula. +reshufflePlayerNotShuffling=Anda mesti menghidupkan mod kocok dahulu. +skipEmpty=Senarai menunggu masih kosong\! +skipOutOfBounds=Tidak boleh mengeluarkan lagu nombor {0} apabila hanya ada {1} lagu. skipNumberTooLow=Nombor yang diberi mestilah lebih daripada 0. -skipSuccess=Skip trek \#{0}\: **{1} ** -skipRangeInvalid=Pelbagai trek yang ditentukan tidak sah. -skipRangeSuccess=Trek \#{0} untuk \#{1} telah dibuang. -skipTrackNotFound=Tidak dapat mencari trek yang betul untuk di skip. -stopAlreadyEmpty=Aturan sudah kosong. -stopEmptyOne=Aturan yang telah dikosongkan, trek '1' telah dikeluarkan. -stopEmptySeveral=Aturan yang telah dikosongkan, trek `{0}` telah dikeluarkan. -stopAccessDenied=Untuk mengelakkan penyalahgunaan, command ini hanya disediakan untuk orang yang boleh menguruskan mesej. -unpauseQueueEmpty=Aturan masih kosong. -unpausePlayerNotPaused=Pemain tidak dihentikan. -unpauseNoUsers=Tiada pengguna yang terdapat dalam voice chat. -unpauseSuccess=Pemain sekarang tidak lagi dihentikan. -volumeApology=Maaf\! Command ;;volume kini telah tidak digalakkan atas bot muzik awam. Ini adalah kerana ia menyebabkan bot untuk menghabiskan lebih banyak masa pemprosesan audio, beberapa trek sehingga 5 kali lebih, menyebabkan semua pengguna mendengar stutter. Dengan menyahdayakan command ini, FredBoat boleh mainkan muzik lebih tanpa lag. \nSaya cadangkan menetapkan jumlah bot yang melalui menu https\://fred.moe/1vD.png -volumeSyntax=Gunakan '';;volume <0-150>''. {0}% adalah default. Para pemain sedang pada **{1}% **. -volumeSuccess=Menukar volume dari **{0}% ** ke **{1}% **. -exportEmpty=Tiada apa-apa untuk dieksport, aturan adalah kosong. -exportPlaylistResulted=Senarai yang dieksport\: {0}\nAnda boleh berikan URL ini untuk memainkan senarai main semasa nanti. -exportPlaylistFail=Gagal untuk muat naik senarai main ke hastebin.com -listShowShuffled=Menunjukkan senarai main shuffled. -listShowRepeatSingle=Mengulang semula trek semasa. -listShowRepeatAll=Mengulang semula aturan semasa. -listShowHistory=Menunjukkan history trek. -listAddedBy=**{0} ** ditambah oleh **{1} ** ''[{2}]'' -listStreamsOnlySingle=Terdapat **{0} ** yang live {1} dalam aturan. -listStreamsOnlyMultiple=Terdapat **{0} ** yang live {1} dalam aturan. -listStreamsOrTracksSingle=Terdapat **{0} ** {1} dengan masa yang tinggal selama ** [{2}] **{3} dalam aturan. -listStreamsOrTracksMultiple=Terdapat **{0} ** {1} dengan masa yang tinggal selama ** [{2}] **{3} dalam aturan. -streamSingular=stream -streamPlural=streams -listAsWellAsLiveStreams=, serta **{0} ** {1} yang live -trackSingular=trek -trackPlural=treks +skipSuccess=Lagu \#{0} dilangkau\: **{1}** +skipRangeInvalid=Julat lagu yang dinyatakan tidak sah. +skipRangeSuccess=Lagu nombor \#{0} sehingga \#{1} telah dikeluarkan. +skipTrackNotFound=Tidak jumpa lagu untuk dilangkau. +stopAlreadyEmpty=Senarai menunggu memang telah kosong. +stopEmptyOne=Senarai menunggu telah dikosongkan, `1` lagu telah dikeluarkan. +stopEmptySeveral=Senarai menunggu telah dikosongkan, `{0}` lagu telah dikeluarkan. +stopAccessDenied=Untuk mengelakkan penyalahgunaan, perintah ini hanya dikhaskan kepada mereka yang boleh mengurus mesej. +unpauseQueueEmpty=Senarai menunggu masih kosong. +unpausePlayerNotPaused=Pemain tidak dijedakan. +unpauseNoUsers=Tiada pengguna di dalam sembang suara. +unpauseSuccess=Pemain kini tidak dijedakan. +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: +volumeSyntax=Gunakan `;;volume <0-150>`. {0}% ialah nilai lalai.\nPemain kini berada di kekuatan bunyi **{1}%**. +volumeSuccess=Kekuatan bunyi telah ditukar dari **{0}%** kepada **{1}%**. +exportEmpty=Tiada apa-apa untuk dieksport, senarai menunggu kosong. +exportPlaylistResulted=Senarai main yang dieksport\: {0}\nAnda boleh berikan URL ini untuk memainkan semula senarai main. +exportPlaylistFail=Gagal memuat naik senarai main ke hastebin.com +listShowShuffled=Menunjukkan senarai main kocok. +listShowRepeatSingle=Mengulang semula lagu semasa. +listShowRepeatAll=Mengulang semula senarai menunggu semasa. +listShowHistory=Menunjukkan lagu dalam sejarah. +listAddedBy=**{0}** ditambah oleh **{1}** `[{2}]` +listStreamsOnlySingle=Terdapat **{0}** {1} langsung dalam senarai menunggu. +listStreamsOnlyMultiple=Terdapat **{0}** {1} langsung dalam senarai menunggu. +listStreamsOrTracksSingle=Masih ada **{0}** {1} dengan baki masa **[{2}]**{3} dalam senarai menunggu. +listStreamsOrTracksMultiple=Masih ada **{0}** {1} dengan baki masa **[{2}]**{3} dalam senarai menunggu. +streamSingular=strim +streamPlural=strim +listAsWellAsLiveStreams=, serta **{0}** {1} langsung +trackSingular=lagu +trackPlural=lagu npNotPlaying=Tidak memainkan apa-apa. -npNotInHistory=Tiada dalam history trek yang terkini. -npDescription=Description -npLoadedSoundcloud=[{0}/{1}]\n\nLoaded from Soundcloud -npLoadedBandcamp={0}\n\nLoaded from Bandcamp -npLoadedTwitch=Loaded from Twitch +npNotInHistory=Tiada lagu dalam sejarah ketika ini. +npDescription=Keterangan +npLoadedSoundcloud=[{0}/{1}]\n\nDimuatkan dari Soundcloud +npLoadedBandcamp={0}\n\nDimuatkan dari Bandcamp +npLoadedTwitch=Dimuatkan dari Twitch permissionMissingBot=Saya memerlukan kebenaran berikut untuk melaksanakan tindakan tersebut\: -permissionEmbedLinks=Lampiran pautan +permissionEmbedLinks=Pautan Benaman rating=Rating -listeners=Listeners -year=Year +listeners=Pendengar +year=Tahun album=Album -artist=Artist -circle=Circle -npLoadedFromHTTP={0}\n\nLoaded from {1} -npLoadedDefault={0}\n\nLoaded from {1} -noneYet=None yet -npRatingRange={0}/5 from {1} vote(s) -fwdSuccess=Forwarding **{0}** by {1}. -restartSuccess=**{0}** has been restarted. -queueEmpty=The queue is empty. -rewSuccess=Rewinding **{0}** by {1}. -seekSuccess=Seeking **{0}** to {1}. -seekDeniedLiveTrack=You can't seek a live track. -loadPlaySplitListFail=That link leads to a playlist, not a track. Try `;;play` instead. -loadListSuccess=Found and added `{0}` songs from playlist **{1}**. -loadNoMatches=No audio could be found for `{0}`. -loadSplitNotYouTube=This is not a YouTube track. Only YouTube tracks are supported with the `;;split` command. Try using `;;play` instead. -loadSplitNotResolves=Couldn't resolve that video's tracklist. Try using `;;play` instead. -loadFollowingTracksAdded=The following tracks were added\: -loadPlaylistTooMany=Added {0} tracks. Found too many tracks to display. -loadErrorCommon=Error occurred when loading info for `{0}`\:\n{1} -loadErrorSusp=Suspicious error when loading info for `{0}`. -loadQueueTrackLimit=Anda tidak dibenarkan menambah lagu ke dalam suatu barisan dengan melebihi nilai {0}\! Hal ini adalah untuk mengelakkan penyalahgunaan. -loadAnnouncePlaylist=Sedang memuatnaik senarai main **{0}** sebanyak `{1}` lagu. Ini mungkin mengambil sedikit masa, harap bersabar. -playerUserNotInChannel=You must join a voice channel first. -playerJoinConnectDenied=I am not permitted to connect to that voice channel. -playerJoinSpeakDenied=I am not permitted to play music in that voice channel. -playerNotInChannel=Not currently in a channel. -playerLeftChannel=Left channel {0}. -shutdownUpdating=FredBoat\u266a\u266a is updating. This should only take a minute and will reload the current playlist. -shutdownRestarting=FredBoat\u266a\u266a is restarting. This should only take a minute and will reload the current playlist. -shutdownIndef=FredBoat\u266a\u266a is shutting down. Once the bot comes back the current playlist will reload. -shutdownPersistenceFail=Error occurred when saving persistence file\: {0} -reloadSuccess=Reloading playlist. `{0}` tracks found. -trackAnnounce=Now playing **{0}**. -cmdAccessDenied=You are not allowed to use that command\! -utilErrorOccurred=\ an error occured \:anger\: ```java\n{0}\n -errorOccurredTooLong=An error occurred \:anger\: Error was too long to display.\n{0}.txt -errorOccurredTooLongAndUnirestException=An error occurred \:anger\: Was too long and was unable to post to Hastebin\! -malRevealAnime={0}\: Search revealed an anime.\n -malTitle={0}**Title\: **{1}\n -malEnglishTitle={0}**English\: **{1}\n -malSynonyms={0}**Synonyms\: **{1}\n -malEpisodes={0}**Episodes\: **{1}\n -malScore={0}**Score\: **{1}\n -malType={0} ** jenis\: **{1}\n +artist=Artis +circle=Golongan +npLoadedFromHTTP={0}\n\nDimuatkan dari {1} +npLoadedDefault={0}\n\nDimuatkan dari {1} +noneYet=Belum ada +npRatingRange={0}/5 bintang daripada {1} undian +fwdSuccess=Ke depan **{0}** sebanyak {1}. +restartSuccess=**{0}** telah dimulakan semula. +queueEmpty=Senarai menunggu masih kosong. +rewSuccess=Ke belakang **{0}** sebanyak {1}. +seekSuccess=Menjangkau **{0}** kepada {1}. +seekDeniedLiveTrack=Anda tidak boleh menjangkau siaran langsung. +loadPlaySplitListFail=Pautan tersebut memuatkan senarai main, bukan lagu spesifik. Cuba gunakan `;;play`. +loadListSuccess=Kami jumpa `{0}` lagu dari senarai main **{1}** dan menambahnya. +loadNoMatches=Tiada audio dijumpai untuk `{0}`. +loadSplitNotYouTube=Ini bukan lagu dari YouTube. Hanya lagu dari YouTube boleh digunakan dengan perintah `;;split`. Sila cuba gunakan `;;play`. +loadSplitNotResolves=Tak dapat muatkan lagu dari senarai main video tersebut. Sila cuba gunakan `;;play`. +loadFollowingTracksAdded=Lagu berikut telah dimasukkan\: +loadPlaylistTooMany={0} lagu telah dimasukkan. Terlalu banyak lagu yang dijumpai untuk dipaparkan. +loadErrorCommon=Ralat ketika memuatkan maklumat `{0}`\:\n{1} +loadErrorSusp=Ralat mencurigakan ketika memuatkan maklumat `{0}`. +loadQueueTrackLimit=Anda tidak boleh menambah lagu ke dalam senarai menunggu yang ada lebih dari {0} lagu\! Ini kerana kami perlu elakkan penyalahgunaan. +loadAnnouncePlaylist=Sedang memuatkan senarai main **{0}** dengan `{1}` buah lagu. Ia mungkin mengambil sedikit masa, harap bersabar. +playerUserNotInChannel=Anda mesti sertai saluran suara dahulu. +playerJoinConnectDenied=Saya tidak dibenarkan untuk menyambung ke saluran suara anda. +playerJoinSpeakDenied=Saya tidak dibenarkan untuk memainkan muzik dalam saluran suara anda. +playerNotInChannel=Bukan dalam mana-mana saluran. +playerLeftChannel=Meninggalkan saluran {0}. +shutdownUpdating=FredBoat\u266a\u266a sedang dikemaskini. Ia sepatutnya mengambil masa beberapa minit sahaja dan ia akan memuatkan semula senarai main semasa. +shutdownRestarting=FredBoat\u266a\u266a sedang mula semula. Ia sepatutnya mengambil masa beberapa minit sahaja dan ia akan memuatkan semula senarai main semasa. +shutdownIndef=FredBoat\u266a\u266a sedang ditutup. Apabila bot tersebut hidup semula, senarai main semasa akan dimuatkan semula. +shutdownPersistenceFail=Ralat ketika menyimpan fail imbasan\: {0} +reloadSuccess=Memuatkan semula senarai main. `{0}` lagu dijumpai. +trackAnnounce=Sedang memainkan **{0}**. +cmdAccessDenied=Anda tidak dibenarkan untuk menggunakan perintah tersebut\! +utilErrorOccurred=\ telah berlakunya ralat \:anger\: ```java\n{0}\n +errorOccurredTooLong=Berlakunya ralat \:anger\: Ralat terlalu panjang untuk dipaparkan.\n{0}.txt +errorOccurredTooLongAndUnirestException=Berlakunya ralat \:anger\: Ralat terlalu panjang dan tidak dapat dihantarkan ke Hastebin\! +malRevealAnime={0}\: Carian menunjukkan ianya anime.\n +malTitle={0}**Tajuk asal\: **{1}\n +malEnglishTitle={0}**Tajuk Inggeris\: **{1}\n +malSynonyms={0}**Tajuk lainnya\: **{1}\n +malEpisodes={0}**Episod\: **{1}\n +malScore={0}**Markah\: **{1}\n +malType={0}**Jenis\: **{1}\n malStatus={0} ** Status\: **{1}\n malStartDate={0} ** Tarikh mula\: **{1}\n -malEndDate={0} ** Tarikh berhenti\: **{1} -malSynopsis={0} ** Sinopsis\: ** "{1}"\n -malUserReveal={0}\: Carian telah mendedahkan seorang pengguna.\n +malEndDate={0}**Tarikh tamat\: **{1} +malSynopsis={0}**Sinopsis\: ** "{1}"\n +malUserReveal={0}\: Carian menunjukkan ianya pengguna.\n malNoResults={0}\: Tiada keputusan. -malUserName={0} ** Nama\: **{1}\n -malUrl={0} ** URL\: **{1}\n -luaError=\ Satu error Lua berlaku \:anger\: ''''''{0} '''''' -luaErrorOutputTooBig=\ Penampan output adalah terlalu besar \:anger\: perbalahan hanya membenarkan lingkungan 2000 huruf setiap mesej, mendapat {0} -luaTimeout=\ Majlis tamat \:anger\: dibenarkan pengiraan masa ialah {0} saat. -helpSuccess=Dokumentasi telah dihantar ke mesej anda langsung\! -helpDmFailed=Tidak dapat menghantar dokumentasi untuk DMs anda. Sila pastikan bahawa anda tidak mempunyai Upaya\! -helpCommandsPromotion=Katakan {0} untuk belajar apa yang bot ini boleh lakukan\! +malUserName={0}**Nama\: **{1}\n +malUrl={0}**URL\: **{1}\n +luaError=\ Ralat Lua telah berlaku \:anger\:\n```{0}``` +luaErrorOutputTooBig=\ Penimbal output terlalu besar \:anger\: Discord hanya benarkan 2000 aksara per mesej, tapi output anda ada {0} aksara +luaTimeout=\ Fungsi tamat tempoh \:anger\: masa kiraan yang dibenarkan ialah {0} saat. +helpSuccess=Pendokumenan telah dihantar ke dalam kotak mesej peribadi anda\! +helpDmFailed=Tidak boleh hantar pendokumenan ke dalam kotak mesej peribadi anda. Sila pastikan anda tidak melumpuhkan fungsi kotak tersebut\! +helpCommandsPromotion=Sebut {0} untuk belajar apa yang bot ini boleh buat\! +musicCommandsPromotion=Sebut {0} untuk melihat senarai perintah muzik yang lengkap. fuzzyNoResults=Tiada pengguna tersebut -brainfuckCycleLimit=Program melebihi kiraan kitaran maksimum {0} -brainfuckDataPointerOutOfBounds=Penuding data daripada batas-batas\: {0} -brainfuckInputOOB=Input daripada batas-batas di posisi\: {0} -brainfuckNoOutput=\ Jadilah output tidak -weatherLocationNotFound=Tidak dapat mencari lokasi, sila semak {0} input anda. -weatherError=Ralat mendapatkan keadaan cuaca di {0} -avatarSuccess=\ mendapati{0} -configNoArgs=Konfigurasi untuk **{0} **\:'''' '' -configSetTo=kini sudah bersedia untuk ''{0}''. -configUnknownKey={0}\: kekunci tidak diketahui. -configMustBeBoolean={0}\: nilai mestilah benar atau palsu. +brainfuckCycleLimit=Aturcara melebihi kiraan kitaran maksimum {0} +brainfuckDataPointerOutOfBounds=Penuding data melebihi batas\: {0} +brainfuckInputOOB=Input melebihi batas di kedudukan\: {0} +brainfuckNoOutput=\ Tiada output +weatherLocationNotFound=Tidak jumpa lokasi, sila semak input {0} anda. +weatherError=Ralat ketika mendapatkan cuaca untuk {0} +avatarSuccess=\ dah jumpa\n{0} +configNoArgs=Konfigurasi untuk **{0}**\:``` +configSetTo=ditetapkan kepada `{0}`. +configUnknownKey={0}\: Kekunci tidak diketahui. +configMustBeBoolean={0}\: Nilai mestilah true untuk benar atau false untuk palsu. modReason=Sebab -modAuditLogMessage=Tindakan yang dikeluarkan oleh {0}\#{1} [{2}] +modAuditLogMessage=Tindakan dikeluarkan oleh {0}\#{1} [{2}] modFailUserHierarchy=Anda tidak mempunyai peranan yang lebih tinggi daripada {0}. -modFailBotHierarchy=I need to have a higher role than {0}. -modBanFail=Failed to ban {0} -modKickBanFailUserPerms=You must have permission to kick and ban to be able to use this command. -modBanBotPerms=I need to have permission to ban members. -modKickBotPerms=I need to have permission to kick members. -kickSuccess=User {0}\#{1} [{2}] has been kicked. -kickFail=Failed to kick {0} -kickFailSelf=You can't kick yourself. -kickFailOwner=You can't kick the server owner. -kickFailMyself=I can't kick myself. -kickFailUserPerms=You must have permission to kick to be able to use this command. -softbanSuccess=User {0}\#{1} [{2}] has been softbanned. -softbanFailSelf=You can't softban yourself. -softbanFailOwner=You can't softban the server owner. -softbanFailMyself=I can't softban myself. -hardbanSuccess=User {0}\#{1} [{2}] has been banned. -hardbanFailSelf=You can't ban yourself. -hardbanFailOwner=You can't ban the server owner. -hardbanFailMyself=I can't ban myself. -getidSuccess=The id of this guild is {0}. The id of this text channel is {1}. -statsParagraph=\ This bot has been running for {0} days, {1} hours, {2} minutes and {3} seconds.\nThis bot has executed {4} commands this session. -statsRate={0}That''s a rate of {1} commands per hour -catgirlFail=Failed to extract image from {0} -catgirlFailConn=Failed to connect to {0} -hugBot=Thanks for the hugs \:blush\: -hugSuccess=Hugs {0}. -patBot=Thanks for the pats \:blush\: -patSuccess=Pats {0}. -rollSuccess={0} rolls around on the floor. -facedeskSuccess={0} facedesks. -langInvalidCode=The language code {0} doesn''t exist or is unsupported. -langSuccess=Switched to speaking {0}. -langInfo=FredBoat supports several user-contributed languages that you can select with this command. Admins on this server can select a language with `;;lang ` Here is the full list of supported languages\: -langDisclaimer=Translations may not be 100% accurate or complete. Missing translations may be contributed at . -loadSingleTrack=**{0}** has been added to the queue. -loadSingleTrackAndPlay=**{0}** will now play. -invite=Invite link for **{0}**\: +modFailBotHierarchy=Saya perlukan peranan yang lebih tinggi daripada {0}. +modBanFail=Gagal untuk mengharamkan {0} +modKickBanFailUserPerms=Anda mesti mempunyai kebenaran tendang dan haram sebelum anda boleh guna perintah ini. +modBanBotPerms=Saya perlukan kebenaran mengharamkan ahli. +modKickBotPerms=Saya perlukan kebenaran untuk menendang ahli. +kickSuccess=Pengguna {0}\#{1} [{2}] telah ditendang. +kickFail=Gagal menendang {0} +kickFailSelf=Anda tidak boleh menendang diri sendiri. +kickFailOwner=Anda tidak boleh menendang tuan punya pelayan. +kickFailMyself=Saya tidak boleh tendang diri sendiri. +kickFailUserPerms=Anda mesti mempunyai kebenaran menendang untuk menggunakan perintah ini. +softbanSuccess=Pengguna {0}\#{1} [{2}] telah disekat. +softbanFailSelf=Anda tidak boleh menyekat diri sendiri. +softbanFailOwner=Anda tidak boleh menyekat tuan punya pelayan. +softbanFailMyself=Saya tidak boleh menyekat diri sendiri. +hardbanSuccess=Pengguna {0}\#{1} [{2}] telah diharamkan. +hardbanFailSelf=Anda tidak boleh mengharamkan diri sendiri. +hardbanFailOwner=Anda tidak boleh mengharamkan tuan punya pelayan. +hardbanFailMyself=Saya tidak boleh mengharamkan diri sendiri. +getidSuccess=Nombor id persatuan ini ialah {0}. Nombor id saluran teks ini ialah {1}. +statsParagraph=\ Bot ini telah berjalan selama {0} hari, {1} jam, {2} minit dan {3} saat.\nBot ini telah menjalankan {4} perintah pada sesi ini. +statsRate={0}Itu kadar {1} perintah sejam +catgirlFail=Gagal menyari imej dari {0} +catgirlFailConn=Gagal menyambung ke {0} +hugBot=Terima kasih peluk saya \:blush\: +hugSuccess=Peluk {0}. +patBot=Terima kasih tepuk bahu saya \:blush\: +patSuccess=Tepuk bahu {0}. +rollSuccess={0} berguling atas lantai. +facedeskSuccess={0} menghentuk muka ke atas meja. +langInvalidCode=Kod bahasa {0} tidak wujud atau tidak disokong. +langSuccess=Berjaya tukar kepada bahasa {0}. +langInfo=FredBoat menyokong beberapa bahasa sumbangan pengguna yang boleh dipilih dengan perintah ini. Pentadbir pelayan ini boleh memilih bahasa dengan `;;lang ` Di sini disertakan senarai penuh bahasa yang disokong\: +langDisclaimer=Terjemahan mungkin tidak 100% tepat atau lengkap. Terjemahan tidak lengkap boleh disumbangkan kepada . +loadSingleTrack=Senarai menunggu kini mempunyai lagu **{0}**. +loadSingleTrackAndPlay=Lagu ini akan dimainkan sekarang\: **{0}**. +invite=Pautan jemputan untuk **{0}**\: ratelimitedGeneralInfo=Kadar anda sedang dihadkan\! Sila perlahankan. -ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} +ratelimitedSkipCommand=Anda boleh melangkau lebih dari sebuah lagu dengan perintah ini\: {0} ratelimitedGuildSlowLoadingPlaylist=Server ini tidak dibenarkan untuk menambah lagi senarai main buat masa sekarang. Mohon jangan spam senerai main yang panjang. unblacklisted={0} dibuang dari senarai hitam. -serverinfoTitle=Info about {0}\: -serverinfoOnlineUsers=Online Users\: -serverinfoTotalUsers=Total Users\: -serverinfoRoles=Roles\: -serverinfoText=Text Channels\: -serverinfoVoice=Voice Channels\: -serverinfoGuildID=Guild ID\: -serverinfoCreationDate=Creation Date\: -serverinfoOwner=Owner\: -serverinfoVLv=Verification Level\: -userinfoTitle=Information about {0}\: -userinfoUsername=Username\: +serverinfoTitle=Maklumat {0}\: +serverinfoOnlineUsers=Pengguna Dalam Talian\: +serverinfoTotalUsers=Jumlah Pengguna\: +serverinfoRoles=Peranan\: +serverinfoText=Saluran Teks\: +serverinfoVoice=Saluran Suara\: +serverinfoGuildID=ID Persatuan\: +serverinfoCreationDate=Tarikh Penciptaan\: +serverinfoOwner=Pemilik\: +serverinfoVLv=Tahap Pengesahan\: +userinfoTitle=Maklumat {0}\: +userinfoUsername=Nama Pengguna\: userinfoId=ID\: -userinfoNick=Nickname\: -userinfoKnownServer=Known Servers\: -userinfoJoinDate=Join Date\: -userinfoCreationTime=Creation Date\: -userinfoBlacklisted=Blacklisted\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. -eventUsersLeftVC=All users have left the voice channel. The player has been paused. -eventAutoResumed=User presence detected, automatically resuming the player. -commandsFun=Fun -commandsMemes=Memes -commandsUtility=Utility -commandsModeration=Moderation -commandsMaintenance=Maintenance -commandsBotOwner=Bot owner -commandsMoreHelp=Say {0} to get more information on a specific command. -helpUnknownCommand=Unknown command. -helpDocsLocation=Documentation can be found at\: -helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: -helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! -helpNoDmCommands=You cannot send FredBoat commands through DMs. -helpCredits=Created by Fre_d and open source contributors -helpSent=Documentation has been sent to your DMs\! -helpProperUsage=Proper usage\: -helpCommandOwnerRestricted=This command is restricted to the owner of the bot. -helpConfigCommand=Show the config of this guild or adjust settings. -helpLanguageCommand=Show available languages or set a language for this guild. -helpHardbanCommand=Ban a user and delete his messages from the last 7 days. -helpKickCommand=Kick a user from this guild. -helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. -helpMusicCommandsHeader=FredBoat Music Commands -helpJoinCommand=Make the bot join your current voice channel. -helpLeaveCommand=Make the bot leave the current voice channel. -helpPauseCommand=Pause the player. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} -helpPlaySplitCommand=Split a YouTube video into a tracklist provided in it's description. -helpRepeatCommand=Toggle between repeat modes. -helpReshuffleCommand=Reshuffle the current queue. -helpSelectCommand=Select one of the offered tracks after a search to play. -helpShuffleCommand=Toggle shuffle mode for the current queue. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. -helpStopCommand=Stop the player and clear the playlist. Reserved for moderators with Manage Messages permission. -helpUnpauseCommand=Unpause the player. -helpVolumeCommand=Changes the volume. Values are 0-150 and 100 is the default. The volume command is deprecated on the public bot. -helpExportCommand=Export the current queue to a hastebin link, can be later used as a playlist. -helpGensokyoRadioCommand=Show the current song played on gensokyoradio.net -helpListCommand=Display a list of the current songs in the playlist. -helpHistoryCommand=Display a list of the songs in playlist history. -helpNowplayingCommand=Display the currently playing song. -helpForwardCommand=Forward the track by a given amount of time. Example\: -helpRestartCommand=Restart the currently playing track. -helpRewindCommand=Rewind the track by a given amount of time. Example\: -helpSeekCommand=Set the position of the track to the given time. Example\: -helpAvatarCommand=Display the avatar of a user. -helpBrainfuckCommand=Executes Brainfuck code. Example\: -helpWeatherCommand=Display current weather by location. -helpClearCommand=Delete all messages by this bot in the last 50 messages of this channel. -helpCommandsCommand=Show available commands. -helpHelpCommand=Receive help for this bot or help for any command. -helpInviteCommand=Post invite link for this bot. -helpMALCommand=Search MyAnimeList and display an anime or profile of a user. -helpMusicHelpCommand=Show music commands and their usage. -helpSayCommand=Make the bot echo something. -helpServerInfoCommand=Display some stats about this guild. -helpUserInfoCommand=Display information about yourself or a user known to the bot. -helpPerms=Allows whitelisting members and roles for the {0} rank. -helpPrefixCommand=Set the prefix for this guild. -helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. -helpMathOperationAdd=Print the sum of num1 and num2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. -destroyDenied=You must have the manage messages permission to reset the player. -destroyHelp=Reset the player and clear the playlist. Reserved for moderators with Manage Messages permission. -destroySucc=Reset the player and cleared the queue. -listPageNum=Page **{0}** of **{1}**. -permsListTitle=Users and roles with the {0} permissions -permsAdded=Added `{0}` to `{1}`. -permsRemoved=Removed `{0}` from `{1}`. -permsFailSelfDemotion=You cannot remove this as it would render you without admin permissions\! -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} -fuzzyMultiple=Multiple items were found. Did you mean any of these? -fuzzyNothingFound=Nothing found for `{0}`. -cmdPermsTooLow=You don''t have permission to run this command\! This command requires `{0}` but you only have `{1}`. -playersLimited=FredBoat is currently at maximum capacity\! The bot is currently fixed to only play up to `{0}` streams, otherwise we would risk disconnecting from Discord under the network load.\nIf you want to help us increase the limit or you want to use our non-overcrowded bot, please support our work on Patreon\:\n{1}\n\nSorry for the inconvenience\! You might want to try again later. This message usually only appears at peak time. -tryLater=Please try again later. -skipUserSingle=Skipped {0} added by {1}. -skipUserMultiple=Skipped {0} tracks added by {1}. -skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. -voteSkipAdded=Your vote has been added\! -voteSkipAlreadyVoted=You already voted to skip this track\! -voteSkipSkipping={0} have voted to skip. Skipping track {1}. -voteSkipNotEnough={0} have voted to skip. At least {1} needed. -voteSkipEmbedNoVotes=No votes to skip this track yet. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track -mathOperationResult=The result is -mathOperationDivisionByZeroError=I cannot divide by zero. -mathOperationInfinity=The number is too big to be displayed\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +userinfoNick=Nama Samaran\: +userinfoKnownServer=Pelayan Diketahui\: +userinfoJoinDate=Tarikh Penyertaan\: +userinfoCreationTime=Tarikh Penciptaan\: +userinfoBlacklisted=Disenaraihitamkan\: +skipDeniedTooManyTracks=Anda tidak boleh melangkau lagu orang lain sekiranya anda bukan DJ.\nSila pertimbangkan untuk gunakan perintah Voteskip. +eventUsersLeftVC=Semua pengguna telah keluar dari saluran suara. Pemain lagu dijedakan. +eventAutoResumed=Kehadiran pengguna dikesan, menyambung semula pemain secara automatik. +commandsFun=Hiburan +commandsMemes=Meme +commandsUtility=Utiliti +commandsModeration=Kawal Selia +commandsMaintenance=Penyelenggaraan +commandsBotOwner=Pemilik bot +commandsMoreHelp=Sebut {0} untuk dapatkan maklumat lanjut berkaitan sesuatu perintah. +commandsModulesHint=Anda boleh pilih untuk gunakan atau lumpuhkan modul tambahan dengan {0} +helpUnknownCommand=Perintah tidak dikenali. +helpDocsLocation=Pendokumenan boleh dijumpai di\: +helpBotInvite=Nak tambahkan FredBoat dalam pelayan anda? Jika anda mempunyai kebenaran Urus Pelayan untuk persatuan anda, anda boleh mengundang FredBoat\: +helpHangoutInvite=Perlukan bantuan atau ada idea untuk FredBoat? Atau mungkin anda cuma nak bersantai? Sertailah komuniti FredBoat\! +helpNoDmCommands=Anda tidak boleh menghantar perintah FredBoat melalui mesej peribadi. +helpCredits=Dicipta oleh Fre_d dan penyumbang sumber terbuka +helpSent=Pendokumenan telah dihantar ke kotak mesej peribadi anda\! +helpProperUsage=Kegunaan yang sah\: +helpCommandOwnerRestricted=Perintah ini dikhususkan kepada pemilik bot sahaja. +helpConfigCommand=Tunjukkan tatarajah persatuan ini atau laraskan tetapan. +helpLanguageCommand=Tunjukkan bahasa-bahasa yang ada atau tetapkan bahasa untuk persatuan ini. +helpModules=Tunjukkan, gunakan atau lumpuhkan modul perintah untuk persatuan ini. +helpHardbanCommand=Sekat pengguna dan padamkan mesejnya sejak 7 hari yang lepas. +helpKickCommand=Tendang seorang pengguna daripada persatuan ini. +helpSoftbanCommand=Sekat pengguna secara lembut dengan menendangnya dan memadam mesejnya sejak 7 hari lepas. +helpMusicCommandsHeader=Perintah Muzik FredBoat +helpJoinCommand=Masukkan bot ke dalam saluran suara anda sekarang. +helpLeaveCommand=Keluarkan bot daripada saluran suara anda sekarang. +helpPauseCommand=Jedakan pemain. +helpPlayCommand=Mainkan muzik dari URL yang diberikan atau cari lagu. Untuk senarai sumber yang penuh, sila layari {0} +helpPlaySplitCommand=Pecahkan video YouTube menjadi senarai lagu yang disediakan dalam keterangannya. +helpRepeatCommand=Togol antara mod-mod ulangan. +helpReshuffleCommand=Kocok semula senarai menunggu semasa. +helpSelectCommand=Pilih salah satu lagu yang ditawarkan untuk dimainkan selepas pencarian lagu. +helpShuffleCommand=Togol mod kocokan untuk senarai menunggu semasa. +helpSkipCommand=Langkau lagu semasa, lagu yang ke-n dalam senarai menunggu, semua lagu dari n ke m, atau semua lagu daripada pengguna yang dinyatakan. Sila guna perintah ini dengan berhati-hati. +helpStopCommand=Hentikan pemain dan kosongkan senarai main. Dikhaskan kepada moderator dengan kebenaran Mengurus Mesej. +helpUnpauseCommand=Sambung semula pemain. +helpVolumeCommand=Mengubah kuat suara. Nilainya 0-150 dan 100 ialah nilai lalai. Perintah kuat suara tidak digalakkan untuk bot awam. +helpExportCommand=Eksport senarai menunggu semasa kepada pautan hastebin, boleh digunakan semula sebagai senarai main selepas ini. +helpGensokyoRadioCommand=Tunjukkan lagu yang sedang dimainkan di gensokyoradio.net +helpListCommand=Senaraikan lagu dalam senarai main sekarang. +helpHistoryCommand=Senaraikan lagu dalam sejarah senarai main. +helpNowplayingCommand=Paparkan lagu yang sedang dimainkan. +helpForwardCommand=Gerakkan lagu ke depan dengan masa yang diberikan. Contohnya\: +helpRestartCommand=Mulakan semula lagu yang sedang dimainkan. +helpRewindCommand=Gerakkan lagu ke belakang dengan masa yang diberikan. Contohnya\: +helpSeekCommand=Tetapkan kedudukan lagu kepada masa yang diberikan. Contohnya\: +helpAvatarCommand=Paparkan gambar pengguna. +helpBrainfuckCommand=Jalankan kod Brainfuck. Contohnya\: +helpWeatherCommand=Paparkan cuaca semasa mengikut lokasi. +helpClearCommand=Padam semua mesej daripada bot ini dalam kalangan 50 mesej terakhir saluran ini. +helpCommandsCommand=Tunjukkan perintah yang ada. +helpHelpCommand=Terima bantuan untuk bot ini atau bantuan untuk mana-mana perintah. +helpInviteCommand=Hantarkan pautan jemputan bot ini. +helpMALCommand=Cari di MyAnimeList dan paparkan anime atau profil pengguna. +helpMusicHelpCommand=Tunjukkan perintah muzik dan kegunaan mereka. +helpSayCommand=Buatkan bot gemakan sesuatu. +helpServerInfoCommand=Paparkan statistik persatuan ini. +helpUserInfoCommand=Paparkan maklumat diri anda atau pengguna yang bot ketahui. +helpPerms=Membolehkan penyenaraiputihan ahli dan peranan untuk pangkat {0}. +helpPrefixCommand=Tetapkan awalan untuk persatuan ini. +helpVoteSkip=Undi untuk langkau lagu semasa. Perlukan 50% undian daripada semua pengguna dalam sembang suara. +helpMathOperationAdd=Paparkan hasil tambah num1 dan num2. +helpMathOperationSub=Paparkan hasil tolak num2 daripada num1. +helpMathOperationMult=Paparkan hasil darab num1*num2. +helpMathOperationDiv=Paparkan hasil bahagi num1 dibahagi dengan num2. +helpMathOperationMod=Paparkan baki bahagi num1 dibahagi dengan num2. +helpMathOperationPerc=Paparkan peratusan diwakili oleh num1 dalam num2. +helpMathOperationSqrt=Paparkan punca kuasa dua untuk nombor diberi. +helpMathOperationPow=Paparkan hasil kuasa nombor num1^num2. +destroyDenied=Anda mesti mempunyai kebenaran mengurus mesej untuk menetapkan semula pemain. +destroyHelp=Menetapkan semula pemain dan mengosongkan senarai main. Dikhaskan untuk moderator dengan kebenaran Urus Mesej. +destroySucc=Menetapkan semula pemain dan mengosongkan senarai menunggu. +listPageNum=Halaman **{0}** / **{1}**. +permsListTitle=Pengguna dan peranan dengan kebenaran {0} +permsAdded=Telah menambah `{0}` kepada `{1}`. +permsRemoved=Telah buang `{0}` daripada `{1}`. +permsFailSelfDemotion=Anda tidak boleh membuang ini kerana ia akan membuatkan anda kehilangan kebenaran pentadbir\! +permsAlreadyAdded={0} telah pun ditambah ke {1} +permsNotAdded={0} bukan di dalam {1} +fuzzyMultiple=Lebih dari satu item dijumpai. Adakah anda maksudkan salah satu daripada ini? +fuzzyNothingFound=Tiada apa dijumpai untuk `{0}`. +cmdPermsTooLow=Anda tidak ada kebenaran untuk menjalankan perintah ini\! Perintah ini memerlukan `{0}` tetapi anda hanya ada `{1}`. +playersLimited=FredBoat berada pada kapasiti maksimum\! Bot ini kini ditetapkan untuk hanya mainkan sehingga `{0}` strim, jika tidak kami berisiko untuk terputus hubungan dengan Discord kerana beban rangkaian.\nJika anda ingin bantu kami tingkatkan had atau anda ingin gunakan bot yang tidak terlalu sesak, sila sokong kerja kami dekat Patreon\:\n{1}\n\nMaaf kerana menyusahkan anda\! Anda mungkin ingin cuba lagi nanti. Mesej ini selalunya hanya muncul pada waktu puncak. +tryLater=Sila cuba lagi kemudian. +skipUserSingle=Melangkau {0} ditambah oleh {1}. +skipUserMultiple=Melangkau {0} lagu ditambah oleh {1}. +skipUsersMultiple=Melangkau {0} lagu ditambah oleh {1} pengguna. +skipUserNoTracks=Semua pengguna yang dinyatakan tidak mempunyai sebarang lagu dalam senarai menunggu. +voteSkipAdded=Undian anda telah ditambah\! +voteSkipAlreadyVoted=Anda telah mengundi untuk melangkau lagu ini\! +voteSkipSkipping={0} telah mengundi untuk langkau. Sedang melangkau lagu {1}. +voteSkipNotEnough={0} telah mengundi untuk langkau. {1} undian diperlukan untuk melangkau. +voteSkipEmbedNoVotes=Tiada undi untuk melangkau lagu ini lagi. +voteSkipEmbedVoters={0} daripada {1} telah mengundi untuk melangkau lagu semasa +mathOperationResult=Keputusannya +mathOperationDivisionByZeroError=Saya tak boleh bahagi dengan kosong. +mathOperationInfinity=Nombor terlalu besar untuk dipaparkan\! +prefix=Awalan +prefixGuild=Awalan persatuan ini ialah {0} +prefixShowAgain=Anda boleh tunjukkan awalan pada bila-bila masa dengan menyebut nama saya. +moduleAdmin=Pentadbiran +moduleInfo=Maklumat +moduleConfig=Konfigurasi +moduleMusic=Muzik +moduleModeration=Kawal Selia +moduleUtility=Utiliti +moduleFun=Hiburan +moduleLocked=Modul {0} dikunci dan tidak dapat dibolehkan/dilumpuhkan. +moduleCantParse=Modul tersebut tidak wujud. Anda boleh lihat senarai modul yang ada dengan {0} +moduleStatus=Status Modul +moduleDisable=Modul {0} dilumpuhkan. +moduleEnable=Modul {0} dibolehkan. +moduleShowCommands=Sebut {0} untuk melihat perintah dalam modul ini. +modulesCommands=Sebut {0} untuk tunjukkan perintah untuk modul, atau {1} untuk tunjukkan semua perintah. +modulesEnabledInGuild=Modul-modul yang dibolehkan untuk persatuan ini\: +modulesHowTo=Sebut {0} untuk bolehkan/lumpuhkan modul. diff --git a/FredBoat/src/main/resources/lang/nl_NL.properties b/FredBoat/src/main/resources/lang/nl_NL.properties index 432b3400a..a0cef8191 100644 --- a/FredBoat/src/main/resources/lang/nl_NL.properties +++ b/FredBoat/src/main/resources/lang/nl_NL.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=De wachtrij is leeg. unpausePlayerNotPaused=De speler staat niet op pauze. unpauseNoUsers=Er zijn geen gebruikers in het spraakkanaal. unpauseSuccess=De speler is niet meer gepauzeerd. -volumeApology=Sorry\! Het ;;volume-commando is verouderd op de publieke muziekbot. Dit is omdat de bot anders veel meer tijd moet besteden aan het verwerken van audio. Sommige nummers tot vijfmaal meer, waardoor iedereen gehaper hoort. Door deze functie uit te schakelen kan FredBoat veel meer muziek spelen zonder vertraging.\nIk raad aan om het volume van de bot in te stellen via het drop-downmenu https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Gebruik `;;volume <0-150>`. {0}% is het standaard niveau.\nDe speler staat momenteel op **{1}%**. volumeSuccess=Volume veranderd van **{0}%** naar **{1}%**. exportEmpty=Niets om te exporteren, de wachtrij is leeg. @@ -127,6 +127,7 @@ luaTimeout=\ Het is mislukt \:anger\: toegestane verwerkingstijd is {0} seconden helpSuccess=Uitleg is naar je verstuurd via een persoonlijk bericht\! helpDmFailed=Kon niet de documentatie naar jou DM's sturen. Controleer of je dit hebt uitgeschakeld\! helpCommandsPromotion=Zeg {0} om te leren wat deze bot kan doen\! +musicCommandsPromotion=Zeg {0} voor een volledige lijst van muziek commando''s. fuzzyNoResults=Geen gebruikers gevonden brainfuckCycleLimit=Programma heeft de maximale cyclustelling van {0} overschreden brainfuckDataPointerOutOfBounds=Data wijzer werkt niet meer\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderatie commandsMaintenance=Onderhoud commandsBotOwner=Bot eigenaar commandsMoreHelp=Zeg {0} om meer informatie te krijgen over een specifieke opdracht. +commandsModulesHint=Je kan optionele modules aan of uitzetten met {0} helpUnknownCommand=Onbekende opdracht. helpDocsLocation=Documentatie kan worden gevonden op\: helpBotInvite=Wilt u FredBoat aan uw server toevoegen? Als u gemachtigd bent deze Server te beheren voor uw gilde, kunt u FredBoat uitnodigen\: @@ -222,6 +224,7 @@ helpProperUsage=Correcte gebruik\: helpCommandOwnerRestricted=Deze opdracht is beperkt tot de eigenaar van de bot. helpConfigCommand=Laat de gegevens van deze gilde zien of pas instellingen aan. helpLanguageCommand=Laat beschikbare talen zien of kies een taal voor deze gilde. +helpModules=Geef weer/zet aan/zet uit commando modules voor deze guild. helpHardbanCommand=Verban een gebruiker en verwijder zijn berichten van de afgelopen 7 dagen. helpKickCommand=Verwijder een gebruiker van deze gilde. helpSoftbanCommand=Zachtverban een gebruiker door hem van de server te verwijderen en en zijn berichten van de laatste 7 dagen te verwijderen. @@ -302,4 +305,20 @@ mathOperationInfinity=Het nummer is te groot om te laten zien\! prefix=Prefix prefixGuild=De prefix van deze guild is {0} prefixShowAgain=Je kan de prefix zien als je mij pinged. +moduleAdmin=Administratie +moduleInfo=Informatie +moduleConfig=Configuratie +moduleMusic=Muziek +moduleModeration=Moderatie +moduleUtility=Gereedschap +moduleFun=Plezier +moduleLocked=De {0} module is gelocked en kan niet worden aan/uitgezet. +moduleCantParse=Die module bestaat niet, bekijk een lijst van modules met {0} +moduleStatus=Module Status +moduleDisable=Uitgeschakelde module {0}. +moduleEnable=Ingeschakelde module {0}. +moduleShowCommands=Zeg {0} om de commando''s te zien voor deze module. +modulesCommands=Zeg {0} om de commando''s voor een module te zien, of {1} om alle commando''s te laten zien. +modulesEnabledInGuild=Ingeschakelde modules voor deze guild\: +modulesHowTo=Zeg {0} om modules aan of uit te zetten. diff --git a/FredBoat/src/main/resources/lang/no_NO.properties b/FredBoat/src/main/resources/lang/no_NO.properties index 8f4095c6b..a7cdf11bd 100644 --- a/FredBoat/src/main/resources/lang/no_NO.properties +++ b/FredBoat/src/main/resources/lang/no_NO.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=K\u00f8en er tom. unpausePlayerNotPaused=Musikkspilleren er ikke satt p\u00e5 pause. unpauseNoUsers=Det er ingen brukere i samtalen. unpauseSuccess=Musikkspilleren er n\u00e5 blitt sl\u00e5tt p\u00e5. -volumeApology=Beklager\! ;;volume kommandoen har blitt avskrevet fra kommandolisten. Vi gjorde dette p\u00e5 grunn av problemene det skapte med avspilling av sanger. Boten brukte for mye tid p\u00e5 \u00e5 behandle lyd og kunne noen ganger bruke opp til 5 ganger mer tid enn den burde bruke. Dette gjorde at boten stammet ofte. Ved \u00e5 deaktivere denne funksjonen kan FredBoat spille mye mer musikk uten lag. Jeg anbefaler \u00e5 kontrollere volumet via dropdown menyen istedenfor. https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Bruk "; volum <0-150>''. {0}% er standard. Spilleren er p\u00e5 **{1}% **. volumeSuccess=Endret volum fra **{0}% ** til **{1}% **. exportEmpty=Ingenting \u00e5 eksportere. K\u00f8en er tom. @@ -45,7 +45,7 @@ exportPlaylistFail=Kan ikke laste opp spillelisten til hastebin.com listShowShuffled=Viser stokket spilleliste. listShowRepeatSingle=Gjentar gjeldende spor. listShowRepeatAll=Gjentar gjeldende k\u00f8. -listShowHistory=Showing tracks in history. +listShowHistory=Viser l\u00e5ter i listen. listAddedBy=**{0} ** lagt til av **{1} ** [{2}] listStreamsOnlySingle=Det er **{0} ** live {1} i k\u00f8en. listStreamsOnlyMultiple=Det er **{0} ** live {1} i k\u00f8en. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=, samt **{0} ** live {1} trackSingular=spor trackPlural=spor npNotPlaying=Spiller for \u00f8yeblikket ingenting. -npNotInHistory=Currently no tracks in history. +npNotInHistory=For \u00f8yeblikket ingen l\u00e5ter i listen. npDescription=Beskrivelse npLoadedSoundcloud=[{0}/{1}] Lastet fra Soundcloud npLoadedBandcamp={0} lastet inn fra Bandcamp @@ -94,39 +94,40 @@ loadAnnouncePlaylist=Spillelisten **{0}** med opptil `{1}` sanger lastes n\u00e5 playerUserNotInChannel=Du m\u00e5 bli en stemme kanal f\u00f8rst. playerJoinConnectDenied=Jeg har ikke tillatelse til \u00e5 koble til den talekanalen. playerJoinSpeakDenied=Jeg har ikke tillatelse til \u00e5 spille musikk i den talekanalen. -playerNotInChannel=Not currently in a channel. +playerNotInChannel=Ikke for \u00f8yeblikket i en kanal. playerLeftChannel=Forlot kanalen {0}. shutdownUpdating=FredBoat\u266a\u266a oppdateres. Dette tar bare et \u00f8yeblikk vil laste gjeldende spillelisten. -shutdownRestarting=FredBoat\u266a\u266a is restarting. This should only take a minute and will reload the current playlist. -shutdownIndef=FredBoat\u266a\u266a is shutting down. Once the bot comes back the current playlist will reload. -shutdownPersistenceFail=Error occurred when saving persistence file\: {0} -reloadSuccess=Reloading playlist. `{0}` tracks found. -trackAnnounce=Now playing **{0}**. -cmdAccessDenied=You are not allowed to use that command\! -utilErrorOccurred=\ an error occured \:anger\: ```java\n{0}\n -errorOccurredTooLong=An error occurred \:anger\: Error was too long to display.\n{0}.txt -errorOccurredTooLongAndUnirestException=An error occurred \:anger\: Was too long and was unable to post to Hastebin\! -malRevealAnime={0}\: Search revealed an anime.\n -malTitle={0}**Title\: **{1}\n -malEnglishTitle={0}**English\: **{1}\n -malSynonyms={0}**Synonyms\: **{1}\n +shutdownRestarting=FredBoat\u266a\u266a starter p\u00e5 nytt. Dette b\u00f8r ikke ta mer enn et minutt. Spillelisten vil bli lastet inn p\u00e5 nytt. +shutdownIndef=FredBoat\u266a\u266a avsluttes. N\u00e5r FredBoat\u266a\u266a startes opp igjen vil spillelisten lastes inn p\u00e5 nytt. +shutdownPersistenceFail=En feil oppstod n\u00e5r persistence file\: {0} ble lagret +reloadSuccess=Laster inn spilleliste p\u00e5 nytt. `{0}` l\u00e5ter ble funnet. +trackAnnounce=Spiller for \u00f8yeblikket **{0}**. +cmdAccessDenied=Du har ikke tillatelse til \u00e5 bruke den kommandoen\! +utilErrorOccurred=\ en feil oppstod \:anger\: ```java\n{0}\n +errorOccurredTooLong=En feil oppstod \:anger\: Feilen var for lang til \u00e5 kunne vises.\n{0}.txt +errorOccurredTooLongAndUnirestException=En feil oppstod \:anger\: Var for lang og var ikke i stand til \u00e5 poste til Hastebin\! +malRevealAnime={0}\: S\u00f8ket viste en anime.\n +malTitle={0}**Tittel\: **{1}\n +malEnglishTitle={0}**Engelsk\: **{1}\n +malSynonyms={0}**Synonymer\: **{1}\n malEpisodes={0} ** episoder\: **{1}\n -malScore={0}**Score\: **{1}\n +malScore={0}**Stilling\: **{1}\n malType={0}**Type\: **{1}\n malStatus={0}**Status\: **{1}\n -malStartDate={0}**Start date\: **{1}\n -malEndDate={0}**End date\: **{1} -malSynopsis={0}**Synopsis\: **"{1}"\n -malUserReveal={0}\: Search revealed a user.\n -malNoResults={0}\: No results. -malUserName={0}**Name\: **{1}\n +malStartDate={0}**Startet\: **{1}\n +malEndDate={0}**Avsluttet\: **{1} +malSynopsis={0}**Kort oppsummering\: **"{1}"\n +malUserReveal={0}\: S\u00f8ket fant en bruker.\n +malNoResults={0}\: Ikke funnet. +malUserName={0}**Navn\: **{1}\n malUrl={0}**URL\: **{1}\n -luaError=\ A Lua error occured \:anger\:\n```{0}``` -luaErrorOutputTooBig=\ Output buffer is too large \:anger\: Discord only allows 2000 characters per message, got {0} -luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} seconds. -helpSuccess=Documentation has been sent to your direct messages\! -helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! +luaError=\ En Lua feil oppstod \:anger\:\n```{0}``` +luaErrorOutputTooBig=\ Utdatabufferen er for stor \:anger\: Discord tillater bare 2000 tegn per melding, du har {0} +luaTimeout=\ Funksjonen ble tidsavbrutt \:anger\: tillatt beregningstid er {0} sekunder. +helpSuccess=Bruksanvisning er sendt som privat melding\! +helpDmFailed=Kan ikke sende bruksanvisning til deg. Kontroller at du ikke har blokkert/deaktivert meldinger\! helpCommandsPromotion=Say {0} to learn what this bot can do\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Ingen slike brukere brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderering commandsMaintenance=Vedlikehold commandsBotOwner=Bot eier commandsMoreHelp=Si {0} for \u00e5 f\u00e5 mer informasjon om en bestemt kommando. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Riktig bruk\: helpCommandOwnerRestricted=Denne kommandoen er begrenset til eieren av botten. helpConfigCommand=Vis konfigurasjonen av denne guilden eller juster innstillingene. helpLanguageCommand=Vis tilgjengelige spr\u00e5k eller sett et spr\u00e5k for denne guilden. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Forby en bruker tilgang til serveren og slett meldingene hans/hennes fra de siste 7 dagene. helpKickCommand=Spark en bruker fra denne guilden. helpSoftbanCommand=Softban en bruker ved sparket ham og slette sine meldinger fra de siste 7 dagene. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/pl_PL.properties b/FredBoat/src/main/resources/lang/pl_PL.properties index e74e524ba..ff4a09f14 100644 --- a/FredBoat/src/main/resources/lang/pl_PL.properties +++ b/FredBoat/src/main/resources/lang/pl_PL.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=Kolejka odtwarzania jest pusta. unpausePlayerNotPaused=Bot nie jest zatrzymany. unpauseNoUsers=Nie ma \u017cadnych u\u017cytkownik\u00f3w w pokoju rozm\u00f3w. unpauseSuccess=Bot nie jest ju\u017c zatrzymany. -volumeApology=Przepraszamy\! Komenda ;;volume zosta\u0142a dezaprobowana na publicznym muzycznym bocie. Sta\u0142o si\u0119 to poniewa\u017c bot sp\u0119dza o wiele wi\u0119cej czasu przetwarzaj\u0105c d\u017awi\u0119k, niekt\u00f3rych utwor\u00f3w nawet do 5 razy d\u0142u\u017cej, co wywo\u0142ywa\u0142o przeszkadzaj\u0105cy d\u017awi\u0119k. Usuwaj\u0105c ten motyw FredBoat potrafi odtwarza\u0107 o wiele wi\u0119cej muzyki bez lag\u00f3w.\nRekomenduj\u0119 ustawi\u0107 g\u0142o\u015bno\u015b\u0107 bota poprzez g\u0142o\u015bno\u015b\u0107 u\u017cytkownika https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=U\u017cycie `;;volume <0-150>`. {0}% jest domy\u015blnym.\nBot aktualnie jest na **{1}%**. volumeSuccess=Zmieniono g\u0142o\u015bno\u015b\u0107 z **{0}%** do **{1}%**. exportEmpty=Nie ma czego eksportowa\u0107, kolejka odtwarzania jest pusta. @@ -127,6 +127,7 @@ luaTimeout=\ Funkcja przekroczy\u0142a czas \:anger\: Dozwolony czas to {0} seku helpSuccess=Dokumentacja zosta\u0142a wys\u0142ana o bezpo\u015bredniej wiadomo\u015bci\! helpDmFailed=Nie mo\u017cna wys\u0142a\u0107 dokumentacji do DM. Sprawd\u017a, czy nie s\u0105 one wy\u0142\u0105czone\! helpCommandsPromotion=Napisz {0} \u017ceby si\u0119 nauczy\u0107 co ten bot Robi\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Nie ma takich u\u017cytkownik\u00f3w brainfuckCycleLimit=Program przekroczy\u0142 maksymaln\u0105 liczb\u0119 cyklu {0} brainfuckDataPointerOutOfBounds=Wska\u017anik danych przekroczy\u0142 zakres\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderacja commandsMaintenance=Przerwa Techniczna commandsBotOwner=W\u0142a\u015bciciel bota commandsMoreHelp=Napisz {0} aby dosta\u0107 wi\u0119cej informacji o specyficznej komendzie. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Nieznana komenda. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Poprawne zastosowanie\: helpCommandOwnerRestricted=Ta komenda jest tylko ograniczona dla W\u0142a\u015bciciela bota. helpConfigCommand=Poka\u017c config gildii albo ustawienia. helpLanguageCommand=Poka\u017c dost\u0119pne j\u0119zyki lub ustaw j\u0119zyk dla tej gildii. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Zbanuj u\u017cytkownika i usu\u0144 jego wiadomo\u015bci z ostatnich 7 dni. helpKickCommand=Wyrzu\u0107 gracza z tej gildii. helpSoftbanCommand=Zsoftbanuj u\u017cytkowania poprzez wyrzucenie go i usuni\u0119cie jego wiadomo\u015bci z ostatnich siedmiu dni. @@ -302,4 +305,20 @@ mathOperationInfinity=Liczba jest zbyt du\u017ca, aby by\u0107 wy\u015bwietlane\ prefix=Prefiks prefixGuild=Prefiks tego serwera to {0} prefixShowAgain=Mo\u017cesz wy\u015bwietli\u0107 prefiks, za ka\u017cdym razem, kiedy mnie wspomnisz. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Zabawa +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/pt_BR.properties b/FredBoat/src/main/resources/lang/pt_BR.properties index 998d55c97..86e393646 100644 --- a/FredBoat/src/main/resources/lang/pt_BR.properties +++ b/FredBoat/src/main/resources/lang/pt_BR.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=A fila est\u00e1 vazia. unpausePlayerNotPaused=O reprodutor n\u00e3o est\u00e1 pausado. unpauseNoUsers=N\u00e3o existem usu\u00e1rios no chat de voz. unpauseSuccess=O reprodutor n\u00e3o est\u00e1 mais pausado. -volumeApology=Desculpe\! O comando ;;volume n\u00e3o est\u00e1 mais dispon\u00edvel para uso p\u00fablico do bot. Isto porque faz com que o bot gaste muito mais tempo processando \u00e1udio, chegando at\u00e9 a 5 vezes mais, fazendo com que todos percebam distor\u00e7\u00e3o. Desativando este comando, FredBoat pode tocar muito mais faixas sem lag.\nRecomendo ajustar o volume do bot atrav\u00e9s do menu https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Use `;;volume <0-150>`. {0}% \u00e9 o padr\u00e3o.\nO tocador est\u00e1 atualemente a **{1}%**. volumeSuccess=O volume foi alterado de **{0}%** para **%{1}**. exportEmpty=Nada para exportar, a fila est\u00e1 vazia. @@ -127,6 +127,7 @@ luaTimeout=\ Fun\u00e7\u00e3o expirou \:anger\: tempo de computa\u00e7\u00e3o pe helpSuccess=Documenta\u00e7\u00e3o foi enviada \u00e0s suas mensagens diretas\! helpDmFailed=N\u00e3o foi possivel enviar a documenta\u00e7\u00e3o no seu privado. Por favor verifique se voc\u00ea n\u00e3o \u00e0 desabilitou\! helpCommandsPromotion=Diga {0} para saber o que este bot pode fazer\! +musicCommandsPromotion=Diz {0} para ver uma lista completa dos comandos de m\u00fasica. fuzzyNoResults=Sem tais usu\u00e1rios brainfuckCycleLimit=Programa excedeu a contagem de ciclo m\u00e1ximo de {0} brainfuckDataPointerOutOfBounds=Ponteiro de datas fora dos limites\: {0} @@ -211,6 +212,7 @@ commandsModeration=Modera\u00e7\u00e3o commandsMaintenance=Manuten\u00e7\u00e3o commandsBotOwner=Dono do Bot commandsMoreHelp=Diga {0} para obter mais informa\u00e7\u00f5es sobre um comando espec\u00edfico. +commandsModulesHint=Para ativar ou desativar m\u00f3dulos adicionais utiliza {0} helpUnknownCommand=Comando desconhecido. helpDocsLocation=Documenta\u00e7\u00e3o pode ser encontrada em\: helpBotInvite=Deseja adicionar FredBoat ao seu servidor? Se voc\u00ea tiver a permiss\u00e3o Gerenciar Servidor na sua guilda, voc\u00ea pode convidar FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Uso correto\: helpCommandOwnerRestricted=Este comando \u00e9 restrito para o dono do bot. helpConfigCommand=Mostre a configura\u00e7\u00e3o dessa guilda ou ajustar as configura\u00e7\u00f5es. helpLanguageCommand=Mostra os idiomas dispon\u00edveis ou define um idioma para esta guilda. +helpModules=Mostrar, ativar ou desativar m\u00f3dulos de comando para este servidor. helpHardbanCommand=Banir um usu\u00e1rio e apagar suas mensagens dos \u00faltimos 7 dias. helpKickCommand=Expulsar um usu\u00e1rio desta guilda. helpSoftbanCommand=Softban um usu\u00e1rio por expulsa-lo e excluindo as suas mensagens nos \u00faltimos 7 dias. @@ -302,4 +305,20 @@ mathOperationInfinity=O n\u00famero \u00e9 muito grande para ser exibido\! prefix=Prefixo prefixGuild=O prefixo para essa guild \u00e9 {0} prefixShowAgain=Voc\u00ea pode mostrar o prefixo novamente a qualquer momento me mencionando. +moduleAdmin=Administra\u00e7\u00e3o +moduleInfo=Informa\u00e7\u00e3o +moduleConfig=Configura\u00e7\u00e3o +moduleMusic=M\u00fasica +moduleModeration=Modera\u00e7\u00e3o +moduleUtility=Utilidade +moduleFun=Divers\u00e3o +moduleLocked=O m\u00f3dulo {0} est\u00e1 bloqueado e n\u00e3o pode ser ativado/desativado. +moduleCantParse=Esse m\u00f3dulo n\u00e3o existe. Consulta uma lista de m\u00f3dulos dispon\u00edveis com {0} +moduleStatus=Estado do m\u00f3dulo +moduleDisable=M\u00f3dulo {0} desativado. +moduleEnable=M\u00f3dulo {0} sativado. +moduleShowCommands=Utiliza {0} para ver os comandos deste m\u00f3dulo. +modulesCommands=Utiliza {0} para ver os comandos de um m\u00f3dulo, ou {1} para mostrar todos os comandos. +modulesEnabledInGuild=M\u00f3dulos ativos para este servidor\: +modulesHowTo=Utiliza {0} para ativar/desativar m\u00f3dulos. diff --git a/FredBoat/src/main/resources/lang/pt_PT.properties b/FredBoat/src/main/resources/lang/pt_PT.properties index c31b161ae..dc70bcf81 100644 --- a/FredBoat/src/main/resources/lang/pt_PT.properties +++ b/FredBoat/src/main/resources/lang/pt_PT.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=A fila est\u00e1 vazia. unpausePlayerNotPaused=O player n\u00e3o est\u00e1 pausado. unpauseNoUsers=N\u00e3o existem usu\u00e1rios no chat de voz. unpauseSuccess=O reprodutor est\u00e1 agora despausado. -volumeApology=Desculpe\! N\u00e3o \u00e9 recomendado o uso do comando ;;volume em servidores de m\u00fasica p\u00fablica . Isto porque faz com que o bot gaste muito mais tempo de processamento de \u00e1udio, \u00e0s vezes at\u00e9 5 vezes mais, baixando a qualidade de audio para todos. Ao desactivar este comando, FredBoat pode reproduzir muito mais faixas sem lag.\nRecomendo ajustar o volume do bot atrav\u00e9s do menu https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Use `;;volume <0-150>`. {0}% \u00e9 o padr\u00e3o.\nO player est\u00e1 actualmente a **{1}%**. volumeSuccess=Alterado o volume de **{0}%** para **%{1}**. exportEmpty=Nada para exportar, a fila est\u00e1 vazia. @@ -127,6 +127,7 @@ luaTimeout=\ Fun\u00e7\u00e3o expirou \:anger\: tempo de computa\u00e7\u00e3o pe helpSuccess=A documenta\u00e7\u00e3o foi enviada para suas mensagens diretas\! helpDmFailed=N\u00e3o consegui enviar a documenta\u00e7\u00e3o para os seus DMs. Por favor verifique que n\u00e3o as tem desactivadas\! helpCommandsPromotion=Diga {0} para saber o que esse bot pode fazer\! +musicCommandsPromotion=Diz {0} para ver uma lista completa dos comandos de m\u00fasica. fuzzyNoResults=Sem tais usu\u00e1rios brainfuckCycleLimit=Programa excedeu a contagem de ciclo m\u00e1ximo de {0} brainfuckDataPointerOutOfBounds=Ponteiro de datas fora dos limites\: {0} @@ -211,6 +212,7 @@ commandsModeration=Modera\u00e7\u00e3o commandsMaintenance=Manuten\u00e7\u00e3o commandsBotOwner=Dono do bot commandsMoreHelp=Diga {0} para obter mais informa\u00e7\u00f5es sobre um comando espec\u00edfico. +commandsModulesHint=Para ativar ou desativar m\u00f3dulos adicionais utiliza {0} helpUnknownCommand=Comando desconhecido. helpDocsLocation=A documenta\u00e7\u00e3o pode ser encontrada em\: helpBotInvite=Queres adicionar o FredBoat ao teu server? Se tens permiss\u00f5es administrativas, tu podes convdar o FredBoat aqui\: @@ -222,6 +224,7 @@ helpProperUsage=Uso correto\: helpCommandOwnerRestricted=Este comando \u00e9 restrito para o dono do bot. helpConfigCommand=Mostre a configura\u00e7\u00e3o dessa guild ou ajuste as configura\u00e7\u00f5es. helpLanguageCommand=Mostrar l\u00ednguas dispon\u00edveis ou definir um idioma para essa guild. +helpModules=Mostrar, ativar ou desativar m\u00f3dulos de comando para este servidor. helpHardbanCommand=Banir de um usu\u00e1rio e apagar as suas mensagens dos \u00faltimos 7 dias. helpKickCommand=Expulse um usu\u00e1rio dessa guilda. helpSoftbanCommand=Softban um usu\u00e1rio expulsando-o e apagando as suas mensagens dos \u00faltimos 7 dias. @@ -250,7 +253,7 @@ helpRewindCommand=Retroceda a faixa por um determinado per\u00edodo de tempo. Ex helpSeekCommand=Defina a posi\u00e7\u00e3o da faixa no tempo determinado. Exemplo\: helpAvatarCommand=Exiba o avatar de um usu\u00e1rio. helpBrainfuckCommand=Executa o c\u00f3digo Brainfuck. Exemplo\: -helpWeatherCommand=Display current weather by location. +helpWeatherCommand=Mostra a informa\u00e7\u00e3o de tempo atual. helpClearCommand=Elimine todas as mensagens deste bot nas \u00faltimas 50 mensagens deste canal. helpCommandsCommand=Mostre os comandos dispon\u00edveis. helpHelpCommand=Receba ajuda para este bot ou ajuda para qualquer comando. @@ -261,16 +264,16 @@ helpSayCommand=Fazer o bot ecoar algo. helpServerInfoCommand=Exiba algumas estat\u00edsticas sobre esta guilda. helpUserInfoCommand=Exibir informa\u00e7\u00f5es sobre voc\u00ea ou um usu\u00e1rio conhecido para o bot. helpPerms=Permite que membros de whitelisting e fun\u00e7\u00f5es para o posto de {0}. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=Definir o prefixo deste servidor. helpVoteSkip=Vota\u00e7\u00e3o para ignorar a m\u00fasica atual. Precisa de 50% de todos os usu\u00e1rios no bate-papo para votar. -helpMathOperationAdd=Print the sum of num1 and num2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. +helpMathOperationAdd=Imprimir a soma de num1 e num2. +helpMathOperationSub=Imprimir a diferen\u00e7a de subtra\u00e7\u00e3o de num2 pelo num1. +helpMathOperationMult=Imprimir o produto de num1*num2. +helpMathOperationDiv=Imprimir o quoficiente da divis\u00e3o de num1 por num2. +helpMathOperationMod=Imprimir o resto da divis\u00e3o de num1 por num2. +helpMathOperationPerc=Imprimir a percentagem de num1 em num2. +helpMathOperationSqrt=Imprimir a raiz quadrada de num. +helpMathOperationPow=Imprimir o resultado de num1^num2. destroyDenied=Voc\u00ea deve ter a permiss\u00e3o de gerenciar mensagens para redefinir o jogador. destroyHelp=Redefinir o jogador e limpar a lista de reprodu\u00e7\u00e3o. Reservados para moderadores com permiss\u00e3o de gerenciar mensagens. destroySucc=Redefinir o jogador e limpa a fila. @@ -279,27 +282,43 @@ permsListTitle=Usu\u00e1rios e fun\u00e7\u00f5es com as permiss\u00f5es de {0} permsAdded=Adicionado ''{0}'' para ''{1}''. permsRemoved=Retirados ''{1}'', ''{0}''. permsFailSelfDemotion=Voc\u00ea n\u00e3o pode remover isso como voc\u00ea tornaria sem permiss\u00f5es de administrador\! -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} +permsAlreadyAdded={0} j\u00e1 foi adicionado a {1} +permsNotAdded={0} n\u00e3o est\u00e1 em {1} fuzzyMultiple=V\u00e1rios itens foram encontrados. Que quis dizer com qualquer um desses? fuzzyNothingFound=Nada encontrado para ''{0}''. cmdPermsTooLow=Voc\u00ea n\u00e3o tem permiss\u00e3o para executar este comando\! Este comando requer ''{0}'', mas voc\u00ea s\u00f3 tem ''{1}''. -playersLimited=FredBoat is currently at maximum capacity\! The bot is currently fixed to only play up to `{0}` streams, otherwise we would risk disconnecting from Discord under the network load.\nIf you want to help us increase the limit or you want to use our non-overcrowded bot, please support our work on Patreon\:\n{1}\n\nSorry for the inconvenience\! You might want to try again later. This message usually only appears at peak time. -tryLater=Please try again later. +playersLimited=FredBoat \u00e9 atualmente na capacidade m\u00e1xima\! O bot est\u00e1 atualmente fixado para apenas tocar at\u00e9 ''{0}'' streams, caso contr\u00e1rio n\u00f3s arriscar\u00edamos nos a desconectar do Discord devido a sobrecarga da rede.\nSe quiser ajudar-nos a aumentar o limite ou deseja usar o nosso bot sem limites, por favor, apoie o nosso trabalho em Patreon\: {1}\n\nDesculpe pelo inconveniente\! Por favor tente novamente mais tarde. Esta mensagem geralmente apenas aparece em hora de pico. +tryLater=Por favor tente novamente mais tarde. skipUserSingle=Skipped {0} added by {1}. skipUserMultiple=Skipped {0} tracks added by {1}. skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. -voteSkipAdded=Your vote has been added\! +skipUserNoTracks=Nenhum dos utilizadores mencionados tem m\u00fasicas em espera. +voteSkipAdded=O teu voto foi adicionado\! voteSkipAlreadyVoted=Voc\u00ea j\u00e1 votou para pular esta faixa\! -voteSkipSkipping={0} have voted to skip. Skipping track {1}. -voteSkipNotEnough={0} have voted to skip. At least {1} needed. +voteSkipSkipping={0} votaram para passar \u00e1 frente. M\u00fasica ultrapassada {1}. +voteSkipNotEnough={0} votaram para passar \u00e1 frente. Pelo menos {1} necess\u00e1rios. voteSkipEmbedNoVotes=Ainda n\u00e3o h\u00e1 votos para pular esta faixa. voteSkipEmbedVoters={0} de {1} votaram para pular a faixa atual -mathOperationResult=The result is -mathOperationDivisionByZeroError=I cannot divide by zero. -mathOperationInfinity=The number is too big to be displayed\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +mathOperationResult=O resultado \u00e9 +mathOperationDivisionByZeroError=Eu n\u00e3o posso dividir por zero. +mathOperationInfinity=O n\u00famero \u00e9 grande demais para ser exibido\! +prefix=Prefixo +prefixGuild=O prefixo para este servidor \u00e9 {0} +prefixShowAgain=Podes ver o prefixo outra vez a qualquer altura ao mencionar me. +moduleAdmin=Administra\u00e7\u00e3o +moduleInfo=Informa\u00e7\u00e3o +moduleConfig=Configura\u00e7\u00e3o +moduleMusic=M\u00fasica +moduleModeration=Modera\u00e7\u00e3o +moduleUtility=Utilidade +moduleFun=Divers\u00e3o +moduleLocked=O m\u00f3dulo {0} est\u00e1 bloqueado e n\u00e3o pode ser ativado/desativado. +moduleCantParse=Esse m\u00f3dulo n\u00e3o existe. Consulta uma lista de m\u00f3dulos dispon\u00edveis com {0} +moduleStatus=Estado do m\u00f3dulo +moduleDisable=M\u00f3dulo {0} desativado. +moduleEnable=M\u00f3dulo {0} sativado. +moduleShowCommands=Utiliza {0} para ver os comandos deste m\u00f3dulo. +modulesCommands=Utiliza {0} para ver os comandos de um m\u00f3dulo, ou {1} para mostrar todos os comandos. +modulesEnabledInGuild=M\u00f3dulos ativos para este servidor\: +modulesHowTo=Utiliza {0} para ativar/desativar m\u00f3dulos. diff --git a/FredBoat/src/main/resources/lang/ro_RO.properties b/FredBoat/src/main/resources/lang/ro_RO.properties index 55dfa3ed5..1d0a06806 100644 --- a/FredBoat/src/main/resources/lang/ro_RO.properties +++ b/FredBoat/src/main/resources/lang/ro_RO.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=Lista este goal\u0103. unpausePlayerNotPaused=Player-ul nu este pauzat. unpauseNoUsers=\u00cen chat-ul vocal nu se afl\u0103 utilizatori. unpauseSuccess=Playerul nu mai este pauzat. -volumeApology=\u00cemi pare r\u0103u\! Comanda ;;volume a fost depricat\u0103 din bot-ul de muzic\u0103 deoarece cauzeaz\u0103 bot-ului sa petreac\u0103 cu mult mai mult timp proces\u00e2nd audio, unele piese dur\u00e2nd de pan\u0103 de 5 ori mai mult, cauz\u00e2nd calitatea audio s\u0103 se \u00eenr\u0103ut\u0103\u021beasc\u0103 tuturor utilizatorilor. Dezactiv\u00e2nd aceast\u0103 comand\u0103 FredBoat poate reda mai mult\u0103 muzic\u0103 f\u0103r\u0103 probleme. Recomand setarea volumului botului prin meniul de dropdown https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Utilizeaz\u0103 `;;volume <0-150>`. {0}% este volumul prestabilit.\nPlayerul este la **{1}%** momentan. volumeSuccess=Volumul a fost schimbat de la **{0}%** la **{1}\u2105**. exportEmpty=Nu exist\u0103 nimic pentru a fi exportat, lista este goal\u0103. @@ -127,6 +127,7 @@ luaTimeout=\ Func\u021bia a expirat \:anger\: timpul permis calcului este {0} se helpSuccess=Documenta\u021bia \u021bi-a fost trimis\u0103 \u00een mesajele tale directe\! helpDmFailed=Nu am putut s\u0103-\u021bi trimit documenta\u021bia \u00een DM-uri. Te rog s\u0103 verifici dac\u0103 le ai blocate sau nu\! helpCommandsPromotion=Spune {0} pentru a afla ce acest bot poate face\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Nu exist\u0103 utilizatori de acest fel brainfuckCycleLimit=Programul a dep\u0103\u015fit num\u0103rul de cicluri maxime de {0} brainfuckDataPointerOutOfBounds=Indicatorul de date \u00een afara limitelor\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderare commandsMaintenance=Mentenan\u0163\u0103 commandsBotOwner=Proprietarul bot-ului commandsMoreHelp=Spune {0} pentru a ob\u021bine mai multe informa\u021bii despre o anumit\u0103 comand\u0103. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Comand\u0103 necunoscut\u0103. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Utilizare corect\u0103\: helpCommandOwnerRestricted=Aceast\u0103 comand\u0103 este restric\u021bionat\u0103 proprietarului bot-ului. helpConfigCommand=Arat\u0103 config-ul acestui server sau ajusteaz\u0103 set\u0103ri. helpLanguageCommand=Afi\u0219a\u021bi limbile disponibile sau seta\u021bi o limb\u0103 pentru acest server. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Bana\u021bi un utilizator d\u00e2ndu-l afar\u0103 \u0219i \u0219terg\u00e2ndu-i mesajele din ultimele 7 zile. helpKickCommand=D\u0103 un utilizator afar\u0103 din acest server. helpSoftbanCommand=Softbana\u021bi un utilizator d\u00e2ndu-l afar\u0103 \u0219i \u0219terg\u00e2ndu-i mesajele din ultimele 7 zile. @@ -302,4 +305,20 @@ mathOperationInfinity=Num\u0103rul este prea marea pentru a fi ar\u0103tat\! prefix=Prefix prefixGuild=Prefixul pentru acest server este {0} prefixShowAgain=Po\u021bi afi\u0219a prefixul oric\u00e2nd vrei men\u021bion\u00e2ndu-m\u0103. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/ru_RU.properties b/FredBoat/src/main/resources/lang/ru_RU.properties index c9228ad43..ec73a2317 100644 --- a/FredBoat/src/main/resources/lang/ru_RU.properties +++ b/FredBoat/src/main/resources/lang/ru_RU.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\ unpausePlayerNotPaused=\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e. unpauseNoUsers=\u041d\u0430 \u044d\u0442\u043e\u043c \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u043c \u0447\u0430\u0442\u0435 \u043d\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. unpauseSuccess=\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u043e. -volumeApology=\u0418\u0437\u0432\u0438\u043d\u044f\u044e\u0441\u044c\! \u041a\u043e\u043c\u0430\u043d\u0434\u0430 ;;volume \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0439. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0431\u043e\u0442\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0430\u0443\u0434\u0438\u043e. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u0434\u043e 5 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u0442\u0440\u0435\u043a "\u0437\u0430\u0438\u043a\u0430\u0435\u0442\u0441\u044f". \u041f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 FredBot \u043c\u043e\u0436\u0435\u0442 \u0438\u0433\u0440\u0430\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0443\u0437\u044b\u043a\u0438 \u0431\u0435\u0437 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \n\u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 \u0432 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u043c\u0435\u043d\u044e\: https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 ;;volume <0-150>`. {0}% \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.\n\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 ** {1}% **. volumeSuccess=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0430 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u043e\u0442 ** {0}% ** \u0434\u043e ** {1}% **. exportEmpty=\u041d\u0435\u0447\u0435\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430. @@ -127,6 +127,7 @@ luaTimeout=\ \u0412\u0440\u0435\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438 helpSuccess=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0442\u0435\u0431\u0435 \u0432 \u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\! helpDmFailed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0432 \u0432\u0430\u0448\u0438 DMs. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b\! helpCommandsPromotion=\u0421\u043a\u0430\u0436\u0438 {0}, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0431\u043e\u0442\! +musicCommandsPromotion=\u041d\u0430\u043f\u0438\u0448\u0438 {0}, \u0447\u0442\u043e\u0431 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434. fuzzyNoResults=\u041d\u0435\u0442 \u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 brainfuckCycleLimit=\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0446\u0438\u043a\u043b\u043e\u0432 {0} brainfuckDataPointerOutOfBounds=\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u043e\u0432\: {0} @@ -183,7 +184,7 @@ ratelimitedGeneralInfo=\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d \u043b\u ratelimitedSkipCommand=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043e\u0434\u043d\u0443 \u043f\u0435\u0441\u043d\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b\: {0} ratelimitedGuildSlowLoadingPlaylist=\u041d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043b\u0435\u0439\u043b\u0438\u0441\u0442\u044b \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0435 \u043d\u0430\u0434\u043e \u0441\u043f\u0430\u043c\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u043c\u0438 \u043f\u043b\u0435\u0439\u043b\u0438\u0441\u0442\u0430\u043c\u0438. unblacklisted={0} \u0443\u0431\u0440\u0430\u043d \u0438\u0437 \u0447\u0451\u0440\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. -serverinfoTitle=Info about {0}\: +serverinfoTitle=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e {0}\: serverinfoOnlineUsers=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u043d\u043b\u0430\u0439\u043d\: serverinfoTotalUsers=\u0412\u0441\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\: serverinfoRoles=\u0420\u043e\u043b\u0438\: @@ -193,7 +194,7 @@ serverinfoGuildID=ID \u0421\u0435\u0440\u0432\u0435\u0440\u0430\: serverinfoCreationDate=\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\: serverinfoOwner=\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446\: serverinfoVLv=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\: -userinfoTitle=Information about {0}\: +userinfoTitle=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e {0}\: userinfoUsername=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\: userinfoId=ID\: userinfoNick=\u041d\u0438\u043a\: @@ -211,17 +212,19 @@ commandsModeration=\u041c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f commandsMaintenance=\u0422\u0435\u0445\u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 commandsBotOwner=\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0431\u043e\u0442\u0430 commandsMoreHelp=\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 {0} \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. +commandsModulesHint=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441 {0} helpUnknownCommand=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430. -helpDocsLocation=Documentation can be found at\: -helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: -helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! -helpNoDmCommands=You cannot send FredBoat commands through DMs. -helpCredits=Created by Fre_d and open source contributors +helpDocsLocation=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443\: +helpBotInvite=\u0425\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c FredBoat \u043d\u0430 \u0432\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440? \u0415\u0441\u043b\u0438 \u0443 \u0412\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430\: +helpHangoutInvite=\u041d\u0443\u0436\u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0438\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0438\u0434\u0435\u0438 \u0434\u043b\u044f FredBoat? \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f? \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443 FredBoat\! +helpNoDmCommands=\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. +helpCredits=\u0421\u043e\u0437\u0434\u0430\u043d Fre_d \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0432\u043a\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u0432 helpSent=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0442\u0435\u0431\u0435 \u0432 \u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\! helpProperUsage=\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\: helpCommandOwnerRestricted=\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 \u0431\u043e\u0442\u0430. helpConfigCommand=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0438\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. helpLanguageCommand=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. +helpModules=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0433\u0438\u043b\u044c\u0434\u0438\u0438. helpHardbanCommand=\u0417\u0430\u0431\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 7 \u0434\u043d\u0435\u0439. helpKickCommand=\u041a\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. helpSoftbanCommand=\u0421\u043e\u0444\u0442\u0431\u0430\u043d - \u0432\u044b\u0433\u043d\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 7 \u0434\u043d\u0435\u0439. @@ -261,7 +264,7 @@ helpSayCommand=\u0414\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u04 helpServerInfoCommand=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443. helpUserInfoCommand=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0435\u0431\u0435 \u0438\u043b\u0438 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0431\u043e\u0442\u0443. helpPerms=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u0430\u0439\u0442-\u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0440\u043e\u043b\u0435\u0439 {0} \u0440\u0430\u043d\u0433\u0430. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0433\u0438\u043b\u044c\u0434\u0438\u0438. helpVoteSkip=\u0413\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u0435\u0441\u043d\u044e. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 50% \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f. helpMathOperationAdd=\u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0443\u043c\u043c\u0443 1 \u0438 2 \u0447\u0438\u0441\u043b\u0430. helpMathOperationSub=\u0437\u043a\u0448\u0442\u0435 \u0435\u0440\u0443 \u0432\u0448\u0430\u0430\u0443\u043a\u0443\u0442\u0441\u0443 \u0449\u0430 \u044b\u0433\u0438\u0435\u043a\u0444\u0441\u0435\u0448\u0442\u043f \u0442\u0433\u044c2 \u0430\u043a\u0449\u044c \u0442\u0433\u044c1 @@ -299,7 +302,23 @@ voteSkipEmbedVoters={0} \u0438\u0437 {1} \u043f\u0440\u043e\u0433\u043e\u043b\u0 mathOperationResult=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 mathOperationDivisionByZeroError=\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u043e\u043b\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. mathOperationInfinity=\u041d\u043e\u043c\u0435\u0440 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=\u041f\u0440\u0435\u0444\u0438\u043a\u0441 +prefixGuild=\u041f\u0440\u0435\u0444\u0438\u043a\u0441 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0433\u0438\u043b\u044c\u0434\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f {0} +prefixShowAgain=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043d\u043e\u0432\u0430, \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u043c\u0435\u043d\u044f. +moduleAdmin=\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 +moduleInfo=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +moduleConfig=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 +moduleMusic=\u041c\u0443\u0437\u044b\u043a\u0430 +moduleModeration=\u041c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f +moduleUtility=\u0423\u0442\u0438\u043b\u0438\u0442\u0430 +moduleFun=\u0420\u0430\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f +moduleLocked={0} \u043c\u043e\u0434\u0443\u043b\u044c \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e. +moduleCantParse=\u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441 {0} +moduleStatus=\u0421\u0442\u0430\u0442\u0443\u0441 \u043c\u043e\u0434\u0443\u043b\u044f +moduleDisable=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c {0}. +moduleEnable=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c {0}. +moduleShowCommands=\u0413\u043e\u0432\u043e\u0440\u044f\u0442 {0} \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f. +modulesCommands=\u0413\u043e\u0432\u043e\u0440\u044f\u0442 {0} \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f, \u0438\u043b\u0438 {1}, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. +modulesEnabledInGuild=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0433\u0438\u043b\u044c\u0434\u0438\u0438\: +modulesHowTo=\u041d\u0430\u043f\u0438\u0448\u0438 {0} \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439. diff --git a/FredBoat/src/main/resources/lang/sk_SK.properties b/FredBoat/src/main/resources/lang/sk_SK.properties new file mode 100644 index 000000000..a706b844e --- /dev/null +++ b/FredBoat/src/main/resources/lang/sk_SK.properties @@ -0,0 +1,324 @@ +#X-Generator: crowdin.com +playQueueEmpty=Moment\u00e1lne ni\u010d nehr\u00e1. Pou\u017ei nasleduj\u00facu sch\u00e9mu pre pridanie pesni\u010dky\:\n;;play +playAlreadyPlaying=Prehr\u00e1va\u010d u\u017e hr\u00e1. +playVCEmpty=V hlasovom chate nikto nen\u00ed. +playWillNowPlay=Prehr\u00e1va\u010d bude teraz hra\u0165. +playSearching=H\u013ead\u00e1m YouTube pre `{q}`... +playYoutubeSearchError=Stala sa chyba pri h\u013eadan\u00ed YouTubeu. Sk\u00faste da\u0165 priamu url na skladbu namiesto v\u00fdrazov. \n```;;play ``` +playSearchNoResults=\u017diadne v\u00fdsledky pre `{q}` +playSelectVideo=**Pros\u00edm vyberte si jednu z skladieb s pr\u00edkazom`{0}play 1-5`** +joinJoining=Prip\u00e1jam sa na{0} +joinErrorAlreadyJoining=Stala sa chyba. Nem\u00f4\u017eem sa pripoji\u0165 na{0} preto\u017ee sa u\u017e sna\u017e\u00edm prip\u00e1ja\u0165 na tento chat. Pros\u00edm sk\u00faste to e\u0161te raz. +pauseAlreadyPaused=Prehr\u00e1va\u010d u\u017e hr\u00e1. +pauseSuccess=Prehr\u00e1va\u010d je teraz pozastaven\u00fd. M\u00f4\u017eete ho znova spusti\u0165 s pr\u00edkazom `{0}unpause`. +repeatOnSingle=Prehr\u00e1va\u010d teraz zopakuje t\u00fato zvukov\u00fa stopu. +repeatOnAll=Prehr\u00e1va\u010d teraz zopakuje zoznam skladieb. +repeatOff=Prehr\u00e1va\u010d sa u\u017e neopakuje. +selectSuccess=Pesni\u010dka **\#{0}** bola vybran\u00e1\: **{1}** ({2}) +selectInterval=Mus\u00ed to by\u0165 \u010d\u00edslo medzi 1-{0}. +selectSelectionNotGiven=Predt\u00fdm ne\u017e si vyberiete mus\u00edte dosta\u0165 v\u00fdber z ktoktor\u00e9 si m\u00f4\u017eete vybra\u0165. +shuffleOn=Prehr\u00e1va\u010d je teraz zamie\u0161an\u00fd. +shuffleOff=Prehr\u00e1va\u010d u\u017e nie je zamie\u0161an\u00fd. +reshufflePlaylist=Zoznam zamie\u0161an\u00fd. +reshufflePlayerNotShuffling=Najsk\u00f4r mus\u00edte zapn\u00fa\u0165 mie\u0161ajuci m\u00f3d. +skipEmpty=Zoznam je pr\u00e1zdny\! +skipOutOfBounds=Nem\u00f4\u017eete odstr\u00e1ni\u0165 stopu \u010d\u00edslo {0} ke\u010f je tu iba {1} st\u00f4p. +skipNumberTooLow=Dan\u00e9 \u010d\u00edslo mus\u00ed by\u0165 vy\u0161\u0161ie ako 0. +skipSuccess=Presko\u010den\u00e1 stopa \#{0}\: **{1}** +skipRangeInvalid=Zadan\u00fd rozsah je neplatn\u00fd. +skipRangeSuccess=Stopy \#{0} a\u017e \#{1} boli odstr\u00e1nen\u00e9. +skipTrackNotFound=Nemohol n\u00e1js\u0165 skladbu na presko\u010denie. +stopAlreadyEmpty=Zoznam bol u\u017e pr\u00e1zdny. +stopEmptyOne=Zoznam bol vypr\u00e1zdnen\u00fd, "1" stopa bola odstr\u00e1nen\u00e1. +stopEmptySeveral=Zoznam bol vypr\u00e1zdnen\u00fd, `{0}`st\u00f3p bolo odstr\u00e1nen\u00edch. +stopAccessDenied=Aby sa zabr\u00e1nilo zneu\u017e\u00edvaniu, tento pr\u00edkaz je len pre t\u00fdch, ktor\u00ed m\u00f4\u017eu spravova\u0165 spr\u00e1vy. +unpauseQueueEmpty=Zoznam je pr\u00e1zdny. +unpausePlayerNotPaused=Hr\u00e1\u010d nie je pozastaven\u00fd. +unpauseNoUsers=Nie s\u00fa \u017eiadni pou\u017e\u00edvatelia v hlasovom chate. +unpauseSuccess=Hr\u00e1\u010d nie je pozastaven\u00fd. +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: +volumeSyntax=Use `;;volume <0-150>`. {0}% is the default.\nThe player is currently at **{1}%**. +volumeSuccess=Changed volume from **{0}%** to **{1}%**. +exportEmpty=Ni\u010d na export, zoznam je pr\u00e1zdny. +exportPlaylistResulted=Exportovan\u00fd playlist\: {0} \nM\u00f4\u017eete da\u0165 t\u00fato adresu URL aby ste hrali aktu\u00e1lny playlist nesk\u00f4r. +exportPlaylistFail=Nepodarilo sa nahra\u0165 zoznam skladieb na hastebin.com +listShowShuffled=Zobrazuje sa zamie\u0161n\u00fd playlist. +listShowRepeatSingle=Opakujem aktu\u00e1lnu skladbu. +listShowRepeatAll=Opakujem aktu\u00e1lny zoznam skladieb. +listShowHistory=Zobrazujem skladby v hist\u00f3rii. +listAddedBy=**{0} ** pridal **{1} ** `[{2}]` +listStreamsOnlySingle=V zozname je **{0}** st\u00f4p na \u017eivo {1}. +listStreamsOnlyMultiple=V zozname je **{0}** st\u00f4p na \u017eivo {1}. +listStreamsOrTracksSingle=V zozname je **{0} {1} so so zost\u00e1vaj\u00facim \u010dasom **{2}**{3}. +listStreamsOrTracksMultiple=V zozname je **{0}** {1} so so zost\u00e1vaj\u00facim \u010dasom **{2}**{3}. +streamSingular=Stream +streamPlural=Streamy +listAsWellAsLiveStreams=, tak isto ako **{0}** na\u017eivo {1} +trackSingular=skladba +trackPlural=skladby +npNotPlaying=Prav\u00e9 ni\u010d nehr\u00e1. +npNotInHistory=Moment\u00e1lne niesu v hist\u00f3rii \u017eiadne skladby. +npDescription=Popis +npLoadedSoundcloud=[{0}/{1}] \n\n Na\u010d\u00edtan\u00e9 zo Soundcloud +npLoadedBandcamp={0} \n\nNa\u010d\u00edtan\u00e9 z Bandcampu +npLoadedTwitch=Na\u010d\u00edtanie z Twitchu +permissionMissingBot=Potrebujem nasleduj\u00face povolenie aby som mohol spravi\u0165 t\u00fato akciu\: +permissionEmbedLinks=Vlo\u017eien\u00e9 odkazy +rating=Hodnotenie +listeners=Posluch\u00e1\u010di +year=Rok +album=Album +artist=Umelec +circle=Kruh +npLoadedFromHTTP={0}\n\nNa\u010d\u00edtan\u00e9 z {1} +npLoadedDefault={0}\n\nNa\u010d\u00edtan\u00e9 z {1} +noneYet=Zatia\u013e \u017eiadne +npRatingRange={0}/5 z {1} hlas(ov) +fwdSuccess=Pret\u00e1\u010dam **{0}** o {1}. +restartSuccess=**{0}** bola re\u0161tartovan\u00e1. +queueEmpty=Zoznam je pr\u00e1zdny. +rewSuccess=Rewinding **{0}** by {1}. +seekSuccess=Seeking **{0}** to {1}. +seekDeniedLiveTrack=You can't seek a live track. +loadPlaySplitListFail=That link leads to a playlist, not a track. Try `;;play` instead. +loadListSuccess=Found and added `{0}` songs from playlist **{1}**. +loadNoMatches=No audio could be found for `{0}`. +loadSplitNotYouTube=This is not a YouTube track. Only YouTube tracks are supported with the `;;split` command. Try using `;;play` instead. +loadSplitNotResolves=Couldn't resolve that video's tracklist. Try using `;;play` instead. +loadFollowingTracksAdded=The following tracks were added\: +loadPlaylistTooMany=Added {0} tracks. Found too many tracks to display. +loadErrorCommon=Error occurred when loading info for `{0}`\:\n{1} +loadErrorSusp=Suspicious error when loading info for `{0}`. +loadQueueTrackLimit=You can''t add tracks to a queue with more than {0} tracks\! This is to prevent abuse. +loadAnnouncePlaylist=About to load playlist **{0}** with up to `{1}` tracks. This may take a while, please be patient. +playerUserNotInChannel=You must join a voice channel first. +playerJoinConnectDenied=I am not permitted to connect to that voice channel. +playerJoinSpeakDenied=I am not permitted to play music in that voice channel. +playerNotInChannel=Not currently in a channel. +playerLeftChannel=Left channel {0}. +shutdownUpdating=FredBoat\u266a\u266a is updating. This should only take a minute and will reload the current playlist. +shutdownRestarting=FredBoat\u266a\u266a sa re\u0161tartuje. Toto by malo trva\u0165 iba min\u00fatku a re\u0161tartuje to aj zoznam skladieb. +shutdownIndef=FredBoat\u266a\u266a sa vyp\u00edna. Ke\u010f sa vr\u00e1ti nasp\u00e4\u0165 aktu\u00e1lny zoznam skladieb sa re\u0161tartuje. +shutdownPersistenceFail=Error occurred when saving persistence file\: {0} +reloadSuccess=Reloading playlist. `{0}` tracks found. +trackAnnounce=Now playing **{0}**. +cmdAccessDenied=You are not allowed to use that command\! +utilErrorOccurred=\ an error occured \:anger\: ```java\n{0}\n +errorOccurredTooLong=An error occurred \:anger\: Error was too long to display.\n{0}.txt +errorOccurredTooLongAndUnirestException=An error occurred \:anger\: Was too long and was unable to post to Hastebin\! +malRevealAnime={0}\: Search revealed an anime.\n +malTitle={0}**Title\: **{1}\n +malEnglishTitle={0}**English\: **{1}\n +malSynonyms={0}**Synonyms\: **{1}\n +malEpisodes={0}**Episodes\: **{1}\n +malScore={0}**Score\: **{1}\n +malType={0}**Type\: **{1}\n +malStatus={0}**Status\: **{1}\n +malStartDate={0}**Start date\: **{1}\n +malEndDate={0}**End date\: **{1} +malSynopsis={0}**Synopsis\: **"{1}"\n +malUserReveal={0}\: Search revealed a user.\n +malNoResults={0}\: No results. +malUserName={0}**Name\: **{1}\n +malUrl={0}**URL\: **{1}\n +luaError=\ A Lua error occured \:anger\:\n```{0}``` +luaErrorOutputTooBig=\ Output buffer is too large \:anger\: Discord only allows 2000 characters per message, got {0} +luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} seconds. +helpSuccess=Documentation has been sent to your direct messages\! +helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! +helpCommandsPromotion=Say {0} to learn what this bot can do\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. +fuzzyNoResults=No such users +brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} +brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} +brainfuckInputOOB=Input out of bounds at position\: {0} +brainfuckNoOutput=\ There was no output +weatherLocationNotFound=Unable to find location, please check your input {0}. +weatherError=Error retrieving weather for {0} +avatarSuccess=\ found it\n{0} +configNoArgs=Configuration for **{0}**\:``` +configSetTo=is now set to `{0}`. +configUnknownKey={0}\: Unknown key. +configMustBeBoolean={0}\: Value must be true or false. +modReason=Reason +modAuditLogMessage=Action issued by {0}\#{1} [{2}] +modFailUserHierarchy=You do not have a higher role than {0}. +modFailBotHierarchy=I need to have a higher role than {0}. +modBanFail=Failed to ban {0} +modKickBanFailUserPerms=You must have permission to kick and ban to be able to use this command. +modBanBotPerms=I need to have permission to ban members. +modKickBotPerms=I need to have permission to kick members. +kickSuccess=User {0}\#{1} [{2}] has been kicked. +kickFail=Failed to kick {0} +kickFailSelf=You can't kick yourself. +kickFailOwner=You can't kick the server owner. +kickFailMyself=I can't kick myself. +kickFailUserPerms=You must have permission to kick to be able to use this command. +softbanSuccess=User {0}\#{1} [{2}] has been softbanned. +softbanFailSelf=You can't softban yourself. +softbanFailOwner=You can't softban the server owner. +softbanFailMyself=I can't softban myself. +hardbanSuccess=User {0}\#{1} [{2}] has been banned. +hardbanFailSelf=You can't ban yourself. +hardbanFailOwner=You can't ban the server owner. +hardbanFailMyself=I can't ban myself. +getidSuccess=The id of this guild is {0}. The id of this text channel is {1}. +statsParagraph=\ This bot has been running for {0} days, {1} hours, {2} minutes and {3} seconds.\nThis bot has executed {4} commands this session. +statsRate={0}That''s a rate of {1} commands per hour +catgirlFail=Failed to extract image from {0} +catgirlFailConn=Failed to connect to {0} +hugBot=Thanks for the hugs \:blush\: +hugSuccess=Hugs {0}. +patBot=Thanks for the pats \:blush\: +patSuccess=Pats {0}. +rollSuccess={0} rolls around on the floor. +facedeskSuccess={0} facedesks. +langInvalidCode=The language code {0} doesn''t exist or is unsupported. +langSuccess=Switched to speaking {0}. +langInfo=FredBoat supports several user-contributed languages that you can select with this command. Admins on this server can select a language with `;;lang ` Here is the full list of supported languages\: +langDisclaimer=Translations may not be 100% accurate or complete. Missing translations may be contributed at . +loadSingleTrack=**{0}** has been added to the queue. +loadSingleTrackAndPlay=**{0}** will now play. +invite=Invite link for **{0}**\: +ratelimitedGeneralInfo=You are being rate limited\! Please slow down. +ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} +ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. +unblacklisted=Removed {0} from the blacklist. +serverinfoTitle=Info about {0}\: +serverinfoOnlineUsers=Online Users\: +serverinfoTotalUsers=Total Users\: +serverinfoRoles=Roles\: +serverinfoText=Text Channels\: +serverinfoVoice=Voice Channels\: +serverinfoGuildID=Guild ID\: +serverinfoCreationDate=Creation Date\: +serverinfoOwner=Owner\: +serverinfoVLv=Verification Level\: +userinfoTitle=Information about {0}\: +userinfoUsername=Username\: +userinfoId=ID\: +userinfoNick=Nickname\: +userinfoKnownServer=Known Servers\: +userinfoJoinDate=Join Date\: +userinfoCreationTime=Creation Date\: +userinfoBlacklisted=Blacklisted\: +skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +eventUsersLeftVC=All users have left the voice channel. The player has been paused. +eventAutoResumed=User presence detected, automatically resuming the player. +commandsFun=Fun +commandsMemes=Memes +commandsUtility=Utility +commandsModeration=Moderation +commandsMaintenance=Maintenance +commandsBotOwner=Bot owner +commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} +helpUnknownCommand=Unknown command. +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors +helpSent=Documentation has been sent to your DMs\! +helpProperUsage=Proper usage\: +helpCommandOwnerRestricted=This command is restricted to the owner of the bot. +helpConfigCommand=Show the config of this guild or adjust settings. +helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. +helpHardbanCommand=Ban a user and delete his messages from the last 7 days. +helpKickCommand=Kick a user from this guild. +helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. +helpMusicCommandsHeader=FredBoat Music Commands +helpJoinCommand=Make the bot join your current voice channel. +helpLeaveCommand=Make the bot leave the current voice channel. +helpPauseCommand=Pause the player. +helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlaySplitCommand=Split a YouTube video into a tracklist provided in it's description. +helpRepeatCommand=Toggle between repeat modes. +helpReshuffleCommand=Reshuffle the current queue. +helpSelectCommand=Select one of the offered tracks after a search to play. +helpShuffleCommand=Toggle shuffle mode for the current queue. +helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. +helpStopCommand=Stop the player and clear the playlist. Reserved for moderators with Manage Messages permission. +helpUnpauseCommand=Unpause the player. +helpVolumeCommand=Changes the volume. Values are 0-150 and 100 is the default. The volume command is deprecated on the public bot. +helpExportCommand=Export the current queue to a hastebin link, can be later used as a playlist. +helpGensokyoRadioCommand=Show the current song played on gensokyoradio.net +helpListCommand=Display a list of the current songs in the playlist. +helpHistoryCommand=Display a list of the songs in playlist history. +helpNowplayingCommand=Display the currently playing song. +helpForwardCommand=Forward the track by a given amount of time. Example\: +helpRestartCommand=Restart the currently playing track. +helpRewindCommand=Rewind the track by a given amount of time. Example\: +helpSeekCommand=Set the position of the track to the given time. Example\: +helpAvatarCommand=Display the avatar of a user. +helpBrainfuckCommand=Executes Brainfuck code. Example\: +helpWeatherCommand=Display current weather by location. +helpClearCommand=Delete all messages by this bot in the last 50 messages of this channel. +helpCommandsCommand=Show available commands. +helpHelpCommand=Receive help for this bot or help for any command. +helpInviteCommand=Post invite link for this bot. +helpMALCommand=Search MyAnimeList and display an anime or profile of a user. +helpMusicHelpCommand=Show music commands and their usage. +helpSayCommand=Make the bot echo something. +helpServerInfoCommand=Display some stats about this guild. +helpUserInfoCommand=Display information about yourself or a user known to the bot. +helpPerms=Allows whitelisting members and roles for the {0} rank. +helpPrefixCommand=Set the prefix for this guild. +helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. +helpMathOperationAdd=Print the sum of num1 and num2. +helpMathOperationSub=Print the difference of subtracting num2 from num1. +helpMathOperationMult=Print the product of num1*num2. +helpMathOperationDiv=Print the quotient of dividing num1 by num2. +helpMathOperationMod=Print the remainder of dividing num1 by num2. +helpMathOperationPerc=Print the percentage represented by num1 in num2. +helpMathOperationSqrt=Print the square root of num. +helpMathOperationPow=Print the result of num1^num2. +destroyDenied=You must have the manage messages permission to reset the player. +destroyHelp=Reset the player and clear the playlist. Reserved for moderators with Manage Messages permission. +destroySucc=Reset the player and cleared the queue. +listPageNum=Starana **{0}** z **{1}**. +permsListTitle=Users and roles with the {0} permissions +permsAdded=Added `{0}` to `{1}`. +permsRemoved=Removed `{0}` from `{1}`. +permsFailSelfDemotion=You cannot remove this as it would render you without admin permissions\! +permsAlreadyAdded={0} already added to {1} +permsNotAdded={0} is not in {1} +fuzzyMultiple=Multiple items were found. Did you mean any of these? +fuzzyNothingFound=Nothing found for `{0}`. +cmdPermsTooLow=You don''t have permission to run this command\! This command requires `{0}` but you only have `{1}`. +playersLimited=FredBoat is currently at maximum capacity\! The bot is currently fixed to only play up to `{0}` streams, otherwise we would risk disconnecting from Discord under the network load.\nIf you want to help us increase the limit or you want to use our non-overcrowded bot, please support our work on Patreon\:\n{1}\n\nSorry for the inconvenience\! You might want to try again later. This message usually only appears at peak time. +tryLater=Please try again later. +skipUserSingle=Skipped {0} added by {1}. +skipUserMultiple=Skipped {0} tracks added by {1}. +skipUsersMultiple=Skipped {0} tracks added by {1} users. +skipUserNoTracks=None of the mentioned users have any tracks queued. +voteSkipAdded=Your vote has been added\! +voteSkipAlreadyVoted=You already voted to skip this track\! +voteSkipSkipping={0} have voted to skip. Skipping track {1}. +voteSkipNotEnough={0} have voted to skip. At least {1} needed. +voteSkipEmbedNoVotes=No votes to skip this track yet. +voteSkipEmbedVoters={0} out of {1} have voted to skip the current track +mathOperationResult=The result is +mathOperationDivisionByZeroError=I cannot divide by zero. +mathOperationInfinity=The number is too big to be displayed\! +prefix=Prefix +prefixGuild=The prefix for this guild is {0} +prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. + diff --git a/FredBoat/src/main/resources/lang/sr_SP.properties b/FredBoat/src/main/resources/lang/sr_SP.properties index 7fbb0965f..101c8478d 100644 --- a/FredBoat/src/main/resources/lang/sr_SP.properties +++ b/FredBoat/src/main/resources/lang/sr_SP.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=U red \u010dekanja je prazan. unpausePlayerNotPaused=Player nije pauziran. unpauseNoUsers=Nema korisnika trenutno u glasovnom razgovoru. unpauseSuccess=Player je sada unpaused. -volumeApology=Izvini\! ;; Sada su zastarele volumen komandu na bot je javna muzika. Ovo je zbog kako to uzrokuje bot provesti mnogo vi\u0161e vremena obrade zvuka, neki tragovi do 5 puta vi\u0161e, uzrokuju\u0107i svi \u010duti mucao. \u0106ete onemogu\u0107iti ovu funkciju FredBoat ume da svira mnogo vi\u0161e bez razlike. Ja preporu\u010deno da se odredi volumen robot je preko https\://fred.moe/1vD.png menija u padaju\u0107oj listi +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Koristi ''; volumen <0-150>''. {0}% je podrazumevana postavka. Player je trenutno na **{1}% **. volumeSuccess=Promenili volumen od **{0}% ** da **{1}% **. exportEmpty=Ni\u0161ta za izvoz, u red \u010dekanja je prazan. @@ -127,6 +127,7 @@ luaTimeout=\ Funkcija istekla \:anger\: dozvoljeno vreme procesua je {0} sekunda helpSuccess=Upute su poslane u va\u0161e privatne poruke\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=Ka\u017eite {0} da biste saznali \u0161ta mo\u017ee u\u010diniti ovaj bot\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Nema takvih korisnika brainfuckCycleLimit=Program je prema\u0161io maksimalni broj ciklusa koji je {0} brainfuckDataPointerOutOfBounds=Pokaziva\u010d podataka je van granice\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderation commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/sv_SE.properties b/FredBoat/src/main/resources/lang/sv_SE.properties index ce09a9709..aeee5a7b1 100644 --- a/FredBoat/src/main/resources/lang/sv_SE.properties +++ b/FredBoat/src/main/resources/lang/sv_SE.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=K\u00f6n \u00e4r tom. unpausePlayerNotPaused=Spelaren \u00e4r inte pausad. unpauseNoUsers=Det finns inga anv\u00e4ndare i r\u00f6stkanalen. unpauseSuccess=Spelaren \u00e4r nu \u00e5teraktiverad. -volumeApology=F\u00f6rl\u00e5t\! ;;volume-kommandot har blivit borttaget fr\u00e5n den offentliga musikboten. Detta \u00e4r p.g.a att den f\u00e5r boten att spendera mycket mer tid f\u00f6r att bearbeta ljud, upp till fem g\u00e5nger mer f\u00f6r vissa l\u00e5tar vilket f\u00e5r alla att h\u00f6ra stamningar. Genom att avaktivera detta kommando kan FredBoat spela mycket mer musik utan lagg.\nJag rekommenderar att s\u00e4tta botens volym via dropdown-menyn https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Anv\u00e4nd `;;volume <0-150>`. {0}% \u00e4r standarden.\nSpelaren \u00e4r f\u00f6r nuvarande p\u00e5 **{1}%**. volumeSuccess=\u00c4ndrade volymen fr\u00e5n **{0}%** till **{1}%**. exportEmpty=Finns inget att exportera, k\u00f6n \u00e4r tom. @@ -127,6 +127,7 @@ luaTimeout=\ Funktionen tajmade ut \:anger\: den till\u00e5tna bearbetningstiden helpSuccess=Dokumentation har skickats direkt till dig\! helpDmFailed=Kunde inte skicka dokumentation till dina Direktmeddelanden. V\u00e4nligen se till att du inte har dem avst\u00e4ngda\! helpCommandsPromotion=Skriv {0} f\u00f6r att f\u00e5 information vad denna bot kan g\u00f6ra\! +musicCommandsPromotion=S\u00e4g {0} f\u00f6r att se en komplett lista av musikkommandon. fuzzyNoResults=Inga s\u00e5dana anv\u00e4ndare brainfuckCycleLimit=Programmet \u00f6verskred maximala cykel-m\u00e4ngden av {0} brainfuckDataPointerOutOfBounds=Datapekare utom r\u00e4ckvidd\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderation commandsMaintenance=Underh\u00e5ll commandsBotOwner=Bot\u00e4gare commandsMoreHelp=Skriv {0} f\u00f6r att f\u00e5 specifik information f\u00f6r ett kommando. +commandsModulesHint=Du kan sl\u00e5 p\u00e5/av extra moduler med {0} helpUnknownCommand=Ok\u00e4nt kommando. helpDocsLocation=Dokumentation kan hittas p\u00e5\: helpBotInvite=Vill du l\u00e4gga till FredBoat till din server? Har du hantera Server-beh\u00f6righeter f\u00f6r din guild, kan du bjuda in FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=R\u00e4tt anv\u00e4ndning\: helpCommandOwnerRestricted=Detta kommando \u00e4r endast tillg\u00e4ngligt f\u00f6r bot\u00e4garen. helpConfigCommand=Visa konfigurationen f\u00f6r denna server eller justera inst\u00e4llningarna. helpLanguageCommand=Visa tillg\u00e4ngliga spr\u00e5k eller s\u00e4tt ett spr\u00e5k f\u00f6r denna server. +helpModules=Visa, aktivera eller avaktivera kommandomoduler f\u00f6r denna server. helpHardbanCommand=Banna en anv\u00e4ndare och ta bort hans meddelanden fr\u00e5n de senaste 7 dagarna. helpKickCommand=Sparka en anv\u00e4ndare fr\u00e5n detta guild. helpSoftbanCommand=Softbanna en anv\u00e4ndare genom att kicka honom och radera hans meddelanden fr\u00e5n de senaste 7 dagarna. @@ -302,4 +305,20 @@ mathOperationInfinity=Numret \u00e4r f\u00f6r stort f\u00f6r att visas\! prefix=Prefix prefixGuild=Prefixen f\u00f6r denna server \u00e4r {0} prefixShowAgain=Du kan se prefixen n\u00e4r som helst igen genom att @a mig. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Konfiguration +moduleMusic=Musik +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=Modulen {0} \u00e4r l\u00e5st och kan inte aktiveras/avaktiveras. +moduleCantParse=Ingen s\u00e5dan modul finns. Du kan f\u00e5 en lista av tillg\u00e4ngliga moduler med {0} +moduleStatus=Modulstatus +moduleDisable=Avaktiverade modul {0}. +moduleEnable=Aktiverade modul {0}. +moduleShowCommands=S\u00e4g {0} f\u00f6r att se denna moduls kommandon. +modulesCommands=S\u00e4g {0} f\u00f6r att se en moduls kommandon eller {1} f\u00f6r att se alla kommandon. +modulesEnabledInGuild=Aktiverade moduler f\u00f6r denna server\: +modulesHowTo=S\u00e4g {0} f\u00f6r att aktivera/avaktivera moduler. diff --git a/FredBoat/src/main/resources/lang/th_TH.properties b/FredBoat/src/main/resources/lang/th_TH.properties index f407ff197..a70f4835c 100644 --- a/FredBoat/src/main/resources/lang/th_TH.properties +++ b/FredBoat/src/main/resources/lang/th_TH.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e40\u0e1e\u0e25\u0e07\u0e43\u unpausePlayerNotPaused=\u0e1a\u0e2d\u0e15\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e1e\u0e25\u0e07\u0e0a\u0e31\u0e48\u0e27\u0e04\u0e23\u0e32\u0e27\u0e19\u0e30 unpauseNoUsers=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e43\u0e04\u0e23\u0e2d\u0e22\u0e48\u0e39\u0e43\u0e19\u0e2b\u0e49\u0e2d\u0e07\u0e19\u0e35\u0e49 unpauseSuccess=\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e1e\u0e25\u0e07\u0e15\u0e48\u0e2d\u0e19\u0e30 -volumeApology=\u0e42\u0e17\u0e14\u0e17\u0e35\u0e19\u0e30\! \u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 \:;volume \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1a\u0e2d\u0e15\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e30 \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e27\u0e48\u0e32\u0e21\u0e31\u0e19\u0e17\u0e33\u0e43\u0e2b\u0e49 \u0e1a\u0e2d\u0e15\u0e15\u0e49\u0e2d\u0e07\u0e1b\u0e23\u0e30\u0e21\u0e27\u0e25\u0e1c\u0e25\u0e40\u0e40\u0e17\u0e23\u0e47\u0e04 \u0e1a\u0e32\u0e07\u0e40\u0e40\u0e17\u0e23\u0e47\u0e04 \u0e19\u0e32\u0e19\u0e02\u0e36\u0e49\u0e19\u0e16\u0e36\u0e07 5 \u0e40\u0e17\u0e48\u0e32\u0e40\u0e25\u0e22\u0e17\u0e35\u0e40\u0e14\u0e35\u0e22\u0e27 \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e01\u0e34\u0e14\u0e2d\u0e32\u0e01\u0e32\u0e23\u0e01\u0e23\u0e30\u0e15\u0e38\u0e01 \u0e01\u0e32\u0e23\u0e1b\u0e34\u0e14\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e2a\u0e32\u0e21\u0e23\u0e16\u0e25\u0e14\u0e01\u0e32\u0e23\u0e01\u0e23\u0e30\u0e15\u0e38\u0e01\u0e02\u0e2d\u0e07\u0e40\u0e1e\u0e25\u0e07\u0e44\u0e14\u0e49\n\n\u0e40\u0e40\u0e19\u0e30\u0e19\u0e33\u0e43\u0e2b\u0e49\u0e44\u0e1b\u0e1b\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e14\u0e31\u0e07\u0e44\u0e14\u0e49\u0e43\u0e19\u0e19\u0e35\u0e49\! https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\u0e43\u0e0a\u0e49\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 `;;volume <0-150>`. {0}% \u0e04\u0e37\u0e2d\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e14\u0e31\u0e07\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e19\u0e30\n\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e1e\u0e25\u0e07\u0e14\u0e49\u0e27\u0e22\u0e36\u0e27\u0e32\u0e21\u0e14\u0e31\u0e07 **{1}%** \u0e2d\u0e22\u0e48\u0e39\! volumeSuccess=\u0e1b\u0e23\u0e31\u0e1a\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e14\u0e31\u0e07\u0e08\u0e32\u0e01 **{0}%** \u0e40\u0e1b\u0e47\u0e19 **{1}%** \u0e40\u0e40\u0e25\u0e49\u0e27\! exportEmpty=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e2d\u0e30\u0e44\u0e23\u0e43\u0e2b\u0e49\u0e41\u0e1b\u0e25\u0e07 \u0e14\u0e39\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e08\u0e30\u0e44\u0e21\u0e48\u0e21\u0e35\u0e40\u0e1e\u0e25\u0e07\u0e43\u0e19\u0e04\u0e34\u0e27\u0e19\u0e30 @@ -127,6 +127,7 @@ luaTimeout=\ \u0e2b\u0e21\u0e14\u0e40\u0e27\u0e25\u0e32\u0e01\u0e32\u0e23\u0e17\ helpSuccess=\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e16\u0e39\u0e01\u0e2a\u0e48\u0e07\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e41\u0e0a\u0e17\u0e42\u0e14\u0e22\u0e15\u0e23\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e41\u0e25\u0e49\u0e27\! helpDmFailed=\u0e23\u0e30\u0e1a\u0e1a\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e1b\u0e43\u0e2b\u0e49\u0e04\u0e38\u0e13\u0e17\u0e32\u0e07\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e48\u0e27\u0e19\u0e15\u0e31\u0e27\u0e44\u0e14\u0e49 \u0e42\u0e1b\u0e23\u0e14\u0e40\u0e0a\u0e47\u0e04\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 \u0e27\u0e48\u0e32\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e1b\u0e34\u0e14\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e27\u0e49 helpCommandsPromotion=\u0e1a\u0e2d\u0e01\u0e27\u0e48\u0e32 {0} \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e35\u0e22\u0e19\u0e23\u0e39\u0e49\u0e27\u0e48\u0e32\u0e1a\u0e2d\u0e17\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e23\u0e32\u0e22\u0e14\u0e31\u0e07\u0e01\u0e25\u0e48\u0e32\u0e27 brainfuckCycleLimit=\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e01\u0e34\u0e19\u0e08\u0e33\u0e19\u0e27\u0e19\u0e23\u0e2d\u0e1a\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14\u0e02\u0e2d\u0e07 {0} brainfuckDataPointerOutOfBounds=\u0e15\u0e31\u0e27\u0e0a\u0e35\u0e49\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e19\u0e2d\u0e01\u0e02\u0e2d\u0e1a\u0e40\u0e02\u0e15\: {0} @@ -211,6 +212,7 @@ commandsModeration=\u0e1e\u0e34\u0e08\u0e32\u0e23\u0e13\u0e32\u0e01\u0e25\u0e31\ commandsMaintenance=\u0e01\u0e32\u0e23\u0e1a\u0e33\u0e23\u0e38\u0e07\u0e23\u0e31\u0e01\u0e29\u0e32 commandsBotOwner=\u0e40\u0e08\u0e49\u0e32\u0e02\u0e2d\u0e07\u0e1a\u0e2d\u0e17 commandsMoreHelp=\u0e1a\u0e2d\u0e01 {0} \u0e08\u0e30\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e40\u0e09\u0e1e\u0e32\u0e30 +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e23\u0e39\u0e49\u0e08\u0e31\u0e01 helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e17\u0e helpCommandOwnerRestricted=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e16\u0e39\u0e01\u0e08\u0e33\u0e01\u0e31\u0e14\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e40\u0e08\u0e49\u0e32\u0e02\u0e2d\u0e07\u0e1a\u0e2d\u0e17 helpConfigCommand=\u0e41\u0e2a\u0e14\u0e07\u0e01\u0e32\u0e23\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e04\u0e48\u0e32\u0e02\u0e2d\u0e07\u0e01\u0e34\u0e25\u0e14\u0e4c\u0e19\u0e35\u0e49 \u0e2b\u0e23\u0e37\u0e2d\u0e1b\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 helpLanguageCommand=\u0e41\u0e2a\u0e14\u0e07\u0e20\u0e32\u0e29\u0e32\u0e17\u0e35\u0e48\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 \u0e2b\u0e23\u0e37\u0e2d\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e20\u0e32\u0e29\u0e32\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e01\u0e34\u0e25\u0e14\u0e4c\u0e19\u0e35\u0e49 +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=\u0e41\u0e1a\u0e19\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49 \u0e41\u0e25\u0e30\u0e25\u0e1a\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e02\u0e2d\u0e07\u0e40\u0e02\u0e32\u0e08\u0e32\u0e01 7 \u0e27\u0e31\u0e19 helpKickCommand=\u0e40\u0e15\u0e30\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e08\u0e32\u0e01\u0e01\u0e34\u0e25\u0e14\u0e4c\u0e19\u0e35\u0e49 helpSoftbanCommand=Softban \u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49 \u0e42\u0e14\u0e22\u0e01\u0e32\u0e23\u0e40\u0e15\u0e30\u0e40\u0e02\u0e32 \u0e41\u0e25\u0e30\u0e25\u0e1a\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e02\u0e2d\u0e07\u0e40\u0e02\u0e32\u0e08\u0e32\u0e01 7 \u0e27\u0e31\u0e19 @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/tr_TR.properties b/FredBoat/src/main/resources/lang/tr_TR.properties index dd5ce38f3..f8ba3c890 100644 --- a/FredBoat/src/main/resources/lang/tr_TR.properties +++ b/FredBoat/src/main/resources/lang/tr_TR.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=S\u0131ra bo\u015f. unpausePlayerNotPaused=Oynat\u0131c\u0131 durdurulmu\u015f vaziyette de\u011fil. unpauseNoUsers=Sesli konu\u015fmada hi\u00e7 kimse yok. unpauseSuccess=Oynat\u0131c\u0131 ba\u015flat\u0131ld\u0131. -volumeApology=\u00dczg\u00fcn\u00fcz\! ;;volume komutu m\u00fczik botundan kald\u0131r\u0131ld\u0131. Bunun nedeni, botun m\u00fczi\u011fi i\u015flerken zorlanmas\u0131 -baz\u0131 par\u00e7alar\u0131 i\u015flemesi 5 kat\u0131na kadar \u00e7\u0131kabiliyor- baz\u0131 insanlar\u0131n kekeme \u015fark\u0131 sesi duymalar\u0131na neden oluyordu. Bu \u00f6zelli\u011fi devre d\u0131\u015f\u0131 b\u0131rakarak m\u00fczi\u011fin lags\u0131z bir bi\u00e7imde aktar\u0131lmas\u0131n\u0131 kolayla\u015ft\u0131rd\u0131k. Botun sesini g\u00f6sterdi\u011fim \u015fekilde ayarlaman\u0131z\u0131 \u00f6neririm\: https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Kullan\u0131m\: `;;volume <0-150>`. %{0} varsay\u0131lan de\u011fer. Oynat\u0131c\u0131 \u015fu anda **%{1}**. volumeSuccess=Ses **{0}%**den **{1}%**e de\u011fi\u015ftirildi. exportEmpty=\u00c7\u0131kart\u0131lacak bir \u015fey yok, s\u0131ra bo\u015f. @@ -45,7 +45,7 @@ exportPlaylistFail=Oynatma listesi hastebin.com'a y\u00fcklenirken hata olu\u015 listShowShuffled=Kar\u0131\u015ft\u0131r\u0131lm\u0131\u015f oynatma listesi g\u00f6steriliyor.\n\n listShowRepeatSingle=Mevcut par\u00e7a tekrar ediliyor. listShowRepeatAll=Mevcut s\u0131ra tekrar ediliyor. -listShowHistory=Ge\u00e7mi\u015fteki \u015fark\u0131lar g\u00f6steriliyor. +listShowHistory=Ge\u00e7mi\u015f \u015fark\u0131lar g\u00f6steriliyor. listAddedBy=**{0}**, ekleyen **{1}** `[{2}]` listStreamsOnlySingle=**{0}** \u00e7alan, {1} tane de s\u0131rada par\u00e7a var. listStreamsOnlyMultiple=**{0}** \u00e7alan, {1} tane de s\u0131rada par\u00e7a var. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=, ayn\u0131 zamanda **{0}** canl\u0131 {1} trackSingular=par\u00e7a trackPlural=par\u00e7alar npNotPlaying=\u015euan hi\u00e7bir \u015fey \u00e7alm\u0131yor. -npNotInHistory=Ge\u00e7mi\u015fte g\u00f6sterilebilecek par\u00e7a yok. +npNotInHistory=Ge\u00e7mi\u015fte g\u00f6sterilecek par\u00e7a yok. npDescription=A\u00e7\u0131klama npLoadedSoundcloud=[{0}/{1}]\n\nSoundcloud''dan y\u00fcklendi npLoadedBandcamp={0}\n\nBandcamp''ten y\u00fcklendi @@ -127,6 +127,7 @@ luaTimeout=\ Fonksiyon zaman a\u015f\u0131m\u0131na u\u011frad\u0131 \:anger\: i helpSuccess=D\u00f6k\u00fcmanlar direk mesajla ile size g\u00f6nderildi\! helpDmFailed=Belgeler mesaj yoluyla g\u00f6nderilemedi. L\u00fctfen \u00f6zel mesajlar\u0131n\u0131z\u0131 kapatmad\u0131\u011f\u0131n\u0131z\u0131 kontrol edin\! helpCommandsPromotion=Bu bot ne yapabilir \u00f6\u011frenmek i\u00e7in {0} yaz\u0131n\! +musicCommandsPromotion={0} yazarak t\u00fcm m\u00fczik komutlar\u0131na bak\u0131n. fuzzyNoResults=B\u00f6yle bir kullan\u0131c\u0131 yok brainfuckCycleLimit=Program maksimum d\u00f6ng\u00fc say\u0131s\u0131 olan {0}''\u0131 a\u015ft\u0131 brainfuckDataPointerOutOfBounds=Veri i\u015faretleyici s\u0131n\u0131rlar\u0131n d\u0131\u015f\u0131nda\: {0} @@ -200,7 +201,7 @@ userinfoNick=Rumuzu\: userinfoKnownServer=Bilinen Sunucular\u0131\: userinfoJoinDate=Kat\u0131lma Tarihi\: userinfoCreationTime=Olu\u015fturulma Tarihi\: -userinfoBlacklisted="Kara listeye al\u0131nd\u0131\: +userinfoBlacklisted=Kara listeye al\u0131nd\u0131\: skipDeniedTooManyTracks=E\u011fer DJ de\u011filseniz ba\u015fkas\u0131n\u0131n par\u00e7as\u0131n\u0131 atlayamazs\u0131n\u0131z.\nVoteskip komutunu kullanmay\u0131 deneyin. eventUsersLeftVC=T\u00fcm kullan\u0131c\u0131lar sesli kanaldan ayr\u0131ld\u0131. \u015eark\u0131 oynat\u0131m\u0131 durduruldu. eventAutoResumed=Kullan\u0131c\u0131 ba\u011fland\u0131, m\u00fczik \u00e7alar devam ettiriliyor. @@ -211,6 +212,7 @@ commandsModeration=Moderasyon commandsMaintenance=Bak\u0131m commandsBotOwner=Bot sahibi commandsMoreHelp=Belirli bir komutla ilgili daha fazla bilgi almak i\u00e7in {0} yaz. +commandsModulesHint={0} ile ilave mod\u00fclleri aktif ve pasif hale getirebilirsiniz helpUnknownCommand=Bilinmeyen komut. helpDocsLocation=Belgeler \u015furada bulunabilir\: helpBotInvite=FredBoat'\u0131 sunucunuza eklemek ister misiniz? E\u011fer eklemek istedi\u011finiz sunucuda "Sunucuyu Y\u00f6net" yetkiniz varsa, FredBoat'\u0131 buradan davet edebilirsiniz\: @@ -222,6 +224,7 @@ helpProperUsage=Do\u011fru kullan\u0131m\: helpCommandOwnerRestricted=Bu komutu sadece bot sahibi kullanabilir. helpConfigCommand=Bu klan\u0131n yap\u0131land\u0131rmas\u0131n\u0131 g\u00f6sterin veya ayarlar\u0131 de\u011fi\u015ftirin. helpLanguageCommand=Mevcut dili g\u00f6sterin veya bu klan i\u00e7in bir dil ayarlay\u0131n. +helpModules=Bu sunucunun komut mod\u00fcllerini g\u00f6ster, aktifle\u015ftir ya da devre d\u0131\u015f\u0131 b\u0131rak. helpHardbanCommand=Bir kullan\u0131c\u0131y\u0131 banla ve son 7 g\u00fcn i\u00e7inde att\u0131\u011f\u0131 mesajlar\u0131 sil. helpKickCommand=Bu klandan bir kullan\u0131c\u0131y\u0131 \u00e7\u0131kart\u0131n. helpSoftbanCommand=Kullan\u0131c\u0131y\u0131 sunucudan atar ve son 7 g\u00fcn i\u00e7erisinde att\u0131\u011f\u0131 mesajlar\u0131 siler. (Kullan\u0131c\u0131y\u0131 banlamaz.). @@ -229,7 +232,7 @@ helpMusicCommandsHeader=FredBoat M\u00fczik Komutlar\u0131 helpJoinCommand=Botun sesli sohbet kanal\u0131n\u0131za kat\u0131lmas\u0131n\u0131 sa\u011flar. helpLeaveCommand=Bot sesli sohbet kanal\u0131n\u0131zdan ayr\u0131lmas\u0131n\u0131 sa\u011flar. helpPauseCommand=Oynat\u0131c\u0131y\u0131 duraklat\u0131r. -helpPlayCommand=Belirtilen link veya arama i\u00e7in bir m\u00fczik \u00e7alar. Kaynaklar\u0131n\u0131n tam listesi i\u00e7in l\u00fctfen {0} adresini ziyaret ediniz +helpPlayCommand=Belirtilen adres veya arama i\u00e7in bir m\u00fczik \u00e7alar. Kaynaklar\u0131n\u0131n tam listesi i\u00e7in l\u00fctfen {0} adresini ziyaret ediniz helpPlaySplitCommand=Bir YouTube videosunu a\u00e7\u0131klamas\u0131ndaki \u015fark\u0131 listesine g\u00f6re ay\u0131r\u0131r. helpRepeatCommand=Tekrarlama modunu de\u011fi\u015ftirir. helpReshuffleCommand=\u00c7alma listesi s\u0131ras\u0131n\u0131 kar\u0131\u015ft\u0131r\u0131r. @@ -261,9 +264,9 @@ helpSayCommand=Botun sizin yazd\u0131\u011f\u0131n\u0131z \u015feyi yazmas\u0131 helpServerInfoCommand=Bu klan hakk\u0131nda baz\u0131 istatistikleri g\u00f6r\u00fcnt\u00fcler. helpUserInfoCommand=Kendiniz veya bot i\u00e7in bilinen bir kullan\u0131c\u0131 hakk\u0131ndaki bilgileri g\u00f6r\u00fcnt\u00fcler. helpPerms={0} s\u0131ralamas\u0131 i\u00e7in beyaz listeye eklenen \u00fcyelere ve rollere izin verir. -helpPrefixCommand=L\u00fctfen sunucunuz i\u00e7in bir "prefix" ayarlay\u0131n. +helpPrefixCommand=L\u00fctfen sunucunuz i\u00e7in bir "k\u0131sayol" ayarlay\u0131n. helpVoteSkip=\u00c7alan \u015fark\u0131y\u0131 atlamak i\u00e7in oylama yap. Sohbetteki kullan\u0131c\u0131lar\u0131n en az %50'sinin oyu gereklidir. -helpMathOperationAdd=num1 + num2 sonucunu yazd\u0131r. +helpMathOperationAdd=Num1 + num2 sonucunu yazd\u0131r. helpMathOperationSub=num1 - num2 sonucunu yazd\u0131r. helpMathOperationMult=num1 * num2 sonucunu yazd\u0131r. helpMathOperationDiv=num1 / num2 sonucunu yazd\u0131r. @@ -278,7 +281,7 @@ listPageNum=Sayfa **{0}**/**{1}**. permsListTitle={0} iznine sahip kullan\u0131c\u0131lar ve roller permsAdded=`{0}`, `{1}`''e eklendi. permsRemoved=`{0}`, `{1}`''den \u00e7\u0131kart\u0131ld\u0131. -permsFailSelfDemotion=Y\u00f6netici izinlerine sahip olmad\u0131\u011f\u0131n\u0131z i\u00e7in kald\u0131ramazs\u0131n\u0131z\! +permsFailSelfDemotion=Y\u00f6netici izinlerine sahip olmad\u0131\u011f\u0131n\u0131z i\u00e7in bunu kald\u0131ramazs\u0131n\u0131z\! permsAlreadyAdded={0} zaten {1} i\u00e7in eklendi permsNotAdded={0}, {1} i\u00e7inde de\u011fil fuzzyMultiple=Birden \u00e7ok komut bulundu. Bunlardan birini mi demek istediniz? @@ -302,4 +305,20 @@ mathOperationInfinity=Say\u0131 g\u00f6r\u00fcnt\u00fclemek i\u00e7in \u00e7ok b prefix=\u00d6n ek prefixGuild=Bu sunucu i\u00e7in prefix\: {0} prefixShowAgain=Her zaman benden bahsederek (mention) \u00f6n eki ortaya \u00e7\u0131karabilirsiniz. +moduleAdmin=Y\u00f6netim +moduleInfo=Bilgi +moduleConfig=Yap\u0131land\u0131rma +moduleMusic=M\u00fczik +moduleModeration=Moderasyon +moduleUtility=Yard\u0131mc\u0131 +moduleFun=E\u011flence +moduleLocked={0} mod\u00fcl\u00fc kilitli ve etkinle\u015ftirilemez/devre d\u0131\u015f\u0131 b\u0131rak\u0131lamaz. +moduleCantParse=Mod\u00fcl bulunamad\u0131. Kullan\u0131labilir mod\u00fclleri {0} ile g\u00f6r\u00fcnt\u00fcleyin +moduleStatus=Mod\u00fcl Durumu +moduleDisable={0} mod\u00fcl\u00fc devre d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131. +moduleEnable={0} mod\u00fcl\u00fc etkinle\u015ftirildi. +moduleShowCommands={0} yazarak bu mod\u00fcl\u00fcn komutlar\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleyin. +modulesCommands={0} yazarak bir mod\u00fcl\u00fcn komutlar\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleyin ya da {1} yazarak t\u00fcm komutlar\u0131 g\u00f6r\u00fcnt\u00fcleyin. +modulesEnabledInGuild=Bu klan i\u00e7in etkin mod\u00fcller\: +modulesHowTo={0} yazarak mod\u00fclleri aktifle\u015ftirin/devre d\u0131\u015f\u0131 b\u0131rak\u0131n. diff --git a/FredBoat/src/main/resources/lang/uk_UA.properties b/FredBoat/src/main/resources/lang/uk_UA.properties index 8242cdcd8..dd56ab0fa 100644 --- a/FredBoat/src/main/resources/lang/uk_UA.properties +++ b/FredBoat/src/main/resources/lang/uk_UA.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=The queue is empty. unpausePlayerNotPaused=The player is not paused. unpauseNoUsers=There are no users in the voice chat. unpauseSuccess=The player is now unpaused. -volumeApology=Sorry\! The ;;volume command has now been deprecated on the public music bot. This is because of how it causes the bot to spend a lot more time processing audio, some tracks up to 5 times more, causing everyone to hear stutter. By disabling this feature FredBoat can play much more music without lag.\nI recommend setting the bot's volume via the dropdown menu https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=Use `;;volume <0-150>`. {0}% is the default.\nThe player is currently at **{1}%**. volumeSuccess=Changed volume from **{0}%** to **{1}%**. exportEmpty=Nothing to export, the queue is empty. @@ -127,6 +127,7 @@ luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} second helpSuccess=Documentation has been sent to your direct messages\! helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! helpCommandsPromotion=Say {0} to learn what this bot can do\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=No such users brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} @@ -211,6 +212,7 @@ commandsModeration=Moderation commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=Unknown command. helpDocsLocation=Documentation can be found at\: helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. helpConfigCommand=Show the config of this guild or adjust settings. helpLanguageCommand=Show available languages or set a language for this guild. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ban a user and delete his messages from the last 7 days. helpKickCommand=Kick a user from this guild. helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. @@ -302,4 +305,20 @@ mathOperationInfinity=The number is too big to be displayed\! prefix=Prefix prefixGuild=The prefix for this guild is {0} prefixShowAgain=You can show the prefix anytime again by mentioning me. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/vi_VN.properties b/FredBoat/src/main/resources/lang/vi_VN.properties index f9390f760..7cf54459b 100644 --- a/FredBoat/src/main/resources/lang/vi_VN.properties +++ b/FredBoat/src/main/resources/lang/vi_VN.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=H\u00e0ng \u0111\u1ee3i \u0111ang tr\u1ed1ng. unpausePlayerNotPaused=M\u00e1y nghe nh\u1ea1c kh\u00f4ng b\u1ecb t\u1ea1m d\u1eebng. unpauseNoUsers=Kh\u00f4ng c\u00f3 ng\u01b0\u1eddi trong cu\u1ed9c tr\u00f2 chuy\u1ec7n b\u1eb1ng gi\u1ecdng n\u00f3i. unpauseSuccess=M\u00e1y nghe nh\u1ea1c b\u00e2y gi\u1edd l\u1ea1i ti\u1ebfp t\u1ee5c. -volumeApology=Xin l\u1ed7i\! L\u1ec7nh ;;volume \u0111\u00e3 b\u1ecb b\u1ecf \u0111i t\u1eeb bot \u00e2m nh\u1ea1c c\u00f4ng c\u1ed9ng. B\u1edfi v\u00ec n\u00f3 l\u00e0m bot chi ti\u00eau r\u1ea5t nhi\u1ec1u th\u1eddi gian x\u1eed l\u00fd \u00e2m thanh, m\u1ed9t s\u1ed1 b\u00e0i nh\u1ea1c l\u00ean \u0111\u1ebfn 5 l\u1ea7n nhi\u1ec1u h\u01a1n, khi\u1ebfn t\u1ea5t c\u1ea3 m\u1ecdi ng\u01b0\u1eddi \u0111\u1ec1u nghe l\u1eb7p l\u1ea1i. B\u1eb1ng c\u00e1ch v\u00f4 hi\u1ec7u t\u00ednh n\u0103ng n\u00e0y FredBoat c\u00f3 th\u1ec3 ch\u01a1i th\u00eam nhi\u1ec1u b\u00e0i h\u00e1t m\u00e0 kh\u00f4ng b\u1ecb lag. M\u00ecnh khuy\u00ean b\u1ea1n n\u00ean thi\u1ebft l\u1eadp \u00e2m thanh c\u1ee7a bot qua menu x\u1ed5 xu\u1ed1ng. https\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=S\u1eed d\u1ee5ng `;;volume <0-150>`. {0}% l\u00e0 m\u1eb7c \u0111\u1ecbnh. M\u00e1y nghe nh\u1ea1c hi\u1ec7n t\u1ea1i \u0111ang \u1edf **{1}% **. volumeSuccess=Thay \u0111\u1ed5i \u00e2m l\u01b0\u1ee3ng t\u1eeb **{0}%** \u0111\u1ebfn **{1}%**. exportEmpty=Kh\u00f4ng c\u00f3 g\u00ec \u0111\u1ec3 xu\u1ea5t ra, h\u00e0ng \u0111\u1ee3i \u0111ang tr\u1ed1ng. @@ -127,6 +127,7 @@ luaTimeout=\ Ch\u1ee9c n\u0103ng \u0111\u00e3 qu\u00e1 gi\u1edd \:anger\: cho ph helpSuccess=T\u00e0i li\u1ec7u h\u01b0\u1edbng d\u1eabn \u0111\u00e3 \u0111\u01b0\u1ee3c g\u1eedi tr\u1ef1c ti\u1ebfp cho b\u1ea1n\! helpDmFailed=C\u00f3 th\u1ec3 kh\u00f4ng g\u1eedi t\u00e0i li\u1ec7u c\u1ee7a b\u1ea1n DMs. H\u00e3y ki\u1ec3m tra r\u1eb1ng b\u1ea1n kh\u00f4ng c\u00f3 h\u1ecd v\u00f4 hi\u1ec7u h\u00f3a\! helpCommandsPromotion=Chat {0} \u0111\u1ec3 t\u00ecm hi\u1ec3u bot n\u00e0y c\u00f3 th\u1ec3 l\u00e0m \u0111\u01b0\u1ee3c g\u00ec\! +musicCommandsPromotion=Say {0} to see a complete list of music commands. fuzzyNoResults=Kh\u00f4ng c\u00f3 ng\u01b0\u1eddi d\u00f9ng n\u00e0y brainfuckCycleLimit=Ch\u01b0\u01a1ng tr\u00ecnh \u0111\u00e3 v\u01b0\u1ee3t qu\u00e1 s\u1ed1 l\u1ea7n l\u1eb7p l\u1ea1i t\u1ed1i \u0111a l\u00e0 {0} brainfuckDataPointerOutOfBounds=Con tr\u1ecf d\u1eef li\u1ec7u n\u1eb1m ngo\u00e0i gi\u1edbi h\u1ea1n\: {0} @@ -211,6 +212,7 @@ commandsModeration=Ki\u1ec3m duy\u1ec7t commandsMaintenance=B\u1ea3o tr\u00ec commandsBotOwner=Ch\u1ee7 s\u1edf h\u1eefu bot commandsMoreHelp=Chat {0} \u0111\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin v\u1ec1 m\u1ed9t l\u1ec7nh c\u1ee5 th\u1ec3. +commandsModulesHint=You can enable and disable additional modules with {0} helpUnknownCommand=L\u1ec7nh kh\u00f4ng r\u00f5. helpDocsLocation=T\u00e0i li\u1ec7u h\u01b0\u1edbng d\u1eabn c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c t\u00ecm th\u1ea5y t\u1ea1i\: helpBotInvite=B\u1ea1n mu\u1ed1n th\u00eam FredBoat v\u00e0o m\u00e1y ch\u1ee7 c\u1ee7a b\u1ea1n? N\u1ebfu b\u1ea1n c\u00f3 quy\u1ec1n truy c\u1eadp qu\u1ea3n l\u00fd m\u00e1y ch\u1ee7 cho guild c\u1ee7a b\u1ea1n, b\u1ea1n c\u00f3 th\u1ec3 m\u1eddi FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=C\u00e1ch d\u00f9ng ch\u00ednh x\u00e1c\: helpCommandOwnerRestricted=L\u1ec7nh n\u00e0y ch\u1ec9 \u0111\u01b0\u1ee3c gi\u1edbi h\u1ea1n cho c\u00e1c ch\u1ee7 s\u1edf h\u1eefu c\u1ee7a bot. helpConfigCommand=Hi\u1ec3n th\u1ecb c\u1ea5u h\u00ecnh guild n\u00e0y ho\u1eb7c \u0111i\u1ec1u ch\u1ec9nh c\u00e0i \u0111\u1eb7t. helpLanguageCommand=Hi\u1ec3n th\u1ecb c\u00e1c ng\u00f4n ng\u1eef c\u00f3 s\u1eb5n ho\u1eb7c thi\u1ebft l\u1eadp m\u1ed9t ng\u00f4n ng\u1eef cho guild n\u00e0y. +helpModules=Show, enable or disable command modules for this guild. helpHardbanCommand=Ch\u1eb7n ng\u01b0\u1eddi d\u00f9ng v\u00e0 x\u00f3a tin nh\u1eafn c\u1ee7a h\u1ecd trong v\u00f2ng 7 ng\u00e0y. helpKickCommand=\u0110\u00e1 m\u1ed9t ng\u01b0\u1eddi d\u00f9ng kh\u1ecfi guild n\u00e0y. helpSoftbanCommand=Ch\u1eb7n t\u1ea1m th\u1eddi ng\u01b0\u1eddi d\u00f9ng b\u1eb1ng c\u00e1ch \u0111\u00e1 h\u1ecd v\u00e0 x\u00f3a tin nh\u1eafn 7 ng\u00e0y g\u1ea7n \u0111\u00e2y. @@ -302,4 +305,20 @@ mathOperationInfinity=S\u1ed1 qu\u00e1 l\u1edbn \u0111\u1ec3 \u0111\u01b0\u1ee3c prefix=Ti\u1ec1n t\u1ed1 prefixGuild=Ti\u1ec1n t\u1ed1 cho guild n\u00e0y l\u00e0 {0} prefixShowAgain=B\u1ea1n c\u00f3 th\u1ec3 hi\u1ec3n th\u1ecb c\u00e1c ti\u1ec1n t\u1ed1 b\u1ea5t c\u1ee9 l\u00fac n\u00e0o m\u1ed9t l\u1ea7n n\u1eefa b\u1eb1ng c\u00e1ch nh\u1eafc \u0111\u1ebfn t\u00f4i. +moduleAdmin=Administration +moduleInfo=Information +moduleConfig=Configuration +moduleMusic=Music +moduleModeration=Moderation +moduleUtility=Utility +moduleFun=Fun +moduleLocked=The {0} module is locked and cannot be enabled/disabled. +moduleCantParse=No such module. Show a list of available modules with {0} +moduleStatus=Module Status +moduleDisable=Disabled module {0}. +moduleEnable=Enabled module {0}. +moduleShowCommands=Say {0} to see the commands of this module. +modulesCommands=Say {0} to show commands for a module, or {1} to show all commands. +modulesEnabledInGuild=Enabled modules for this guild\: +modulesHowTo=Say {0} to enable/disable modules. diff --git a/FredBoat/src/main/resources/lang/zh_CN.properties b/FredBoat/src/main/resources/lang/zh_CN.properties index 73e7c2588..4f9d80047 100644 --- a/FredBoat/src/main/resources/lang/zh_CN.properties +++ b/FredBoat/src/main/resources/lang/zh_CN.properties @@ -1,6 +1,6 @@ #X-Generator: crowdin.com playQueueEmpty=\u5f53\u524d\u672a\u64ad\u653e\u4efb\u4f55\u6b4c\u66f2\u3002\u8bf7\u7528\u4ee5\u4e0b\u8bed\u6cd5\u6dfb\u52a0\u6b4c\u66f2\uff1a\n;;play <\u94fe\u63a5\u6216\u641c\u7d22\u5173\u952e\u5b57> -playAlreadyPlaying=\u6b63\u5728\u64ad\u653e\u4e2d\u3002 +playAlreadyPlaying=\u97f3\u4e50\u64ad\u653e\u5668\u5df2\u7ecf\u5728\u64ad\u653e\u4e2d\u3002 playVCEmpty=\u8bed\u97f3\u804a\u5929\u5ba4\u5f53\u524d\u65e0\u7528\u6237\u3002 playWillNowPlay=\u97f3\u4e50\u5373\u5c06\u5f00\u59cb\u64ad\u653e\u3002 playSearching=\u6b63\u5728 YouTube \u4e2d\u641c\u7d22 `{q}`\u2026\u2026 @@ -36,7 +36,7 @@ unpauseQueueEmpty=\u64ad\u653e\u6e05\u5355\u4e3a\u7a7a unpausePlayerNotPaused=\u5f53\u524d\u672a\u6682\u505c\u64ad\u653e\uff0c\u65e0\u9700\u53d6\u6d88\u6682\u505c\u3002 unpauseNoUsers=\u8bed\u97f3\u804a\u5929\u5ba4\u5f53\u524d\u65e0\u7528\u6237 unpauseSuccess=\u5df2\u7ee7\u7eed\u64ad\u653e -volumeApology=\u62b1\u6b49\uff01`;;volume` \u547d\u4ee4\u5728\u516c\u5f00\u9891\u9053\u5df2\u88ab\u5f03\u7528\u3002\u56e0\u4e3a\u8be5\u547d\u4ee4\u4f1a\u4f7f bot \u5904\u7406\u97f3\u9891\u7684\u65f6\u95f4\u589e\u9ad8\u81f3\u6700\u591a 5 \u500d\uff0c\u8fdb\u800c\u5bfc\u81f4\u97f3\u4e50\u65ad\u65ad\u7eed\u7eed\u3002\u4e3a\u8ba9\u5927\u5bb6\u80fd\u591f\u542c\u5230\u6d41\u7545\u7684\u97f3\u4e50\uff0cFredBoat \u7981\u7528\u4e86\u8be5\u529f\u80fd\u3002\u5982\u9700\u8c03\u8282\u97f3\u91cf\u8bf7\u4f7f\u7528 Discord \u81ea\u5e26\u8c03\u8282\u529f\u80fd\uff0c\u5982\u56fe\u6240\u793a\uff1ahttps\://fred.moe/1vD.png +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\u97f3\u91cf\u8c03\u8282\u8bf7\u4f7f\u7528\u547d\u4ee4\uff1a`;;volume <0-150>`\u3002\u9ed8\u8ba4\u97f3\u91cf\u4e3a\uff1a{0}%\u3002\n\u5f53\u524d\u97f3\u91cf\u4e3a\uff1a**{1}%**\u3002 volumeSuccess=\u97f3\u91cf\u7531 **{0}%** \u66f4\u6539\u81f3 **{1}%**\u3002 exportEmpty=\u64ad\u653e\u5217\u8868\u4e3a\u7a7a\uff0c\u65e0\u6cd5\u5bfc\u51fa\u3002 @@ -127,6 +127,7 @@ luaTimeout=\ \u529f\u80fd\u8d85\u65f6 \:anger\: \u5141\u8bb8\u7684\u9884\u7b97\u helpSuccess=\u5e2e\u52a9\u6587\u6863\u5df2\u901a\u8fc7\u79c1\u804a\u53d1\u7ed9\u60a8\u4e86\uff01 helpDmFailed=\u65e0\u6cd5\u5411\u60a8\u7684 DMs \u53d1\u9001\u6587\u6863\u3002\u8bf7\u68c0\u67e5\u60a8\u6ca1\u6709\u7981\u7528\u5b83\u4eec\! helpCommandsPromotion=\u8bf4 {0}, \u4e86\u89e3\u8fd9\u4e2a\u673a\u5668\u4eba\u53ef\u4ee5\u505a\u4ec0\u4e48\! +musicCommandsPromotion=\u8bf4 {0} \u67e5\u770b\u5b8c\u6574\u7684\u97f3\u4e50\u547d\u4ee4\u5217\u8868\u3002 fuzzyNoResults=\u7528\u6237\u4e0d\u5b58\u5728 brainfuckCycleLimit=\u7a0b\u5e8f\u8d85\u51fa\u6700\u5927\u5faa\u73af\u6b21\u6570 {0} brainfuckDataPointerOutOfBounds=\u6570\u636e\u6307\u9488\u8d8a\u754c\uff1a{0} @@ -211,6 +212,7 @@ commandsModeration=\u7ba1\u7406 commandsMaintenance=\u7cfb\u7edf\u7ef4\u62a4 commandsBotOwner=\u673a\u5668\u4eba\u4e3b\u4eba commandsMoreHelp=\u8bf4{0} \u83b7\u53d6\u6709\u5173\u7279\u5b9a\u547d\u4ee4\u7684\u66f4\u591a\u4fe1\u606f\u3002 +commandsModulesHint=\u53ef\u4ee5\u4f7f\u7528 {0} \u542f\u7528\u548c\u7981\u7528\u5176\u4ed6\u6a21\u5757 helpUnknownCommand=\u672a\u77e5\u7684\u6307\u4ee4\u3002 helpDocsLocation=\u6587\u6863\u53ef\u4ee5\u5728\u4ee5\u4e0b\u65b9\u9762\u627e\u5230\: helpBotInvite=\u8981\u5c06 FredBoat \u6dfb\u52a0\u5230\u60a8\u7684\u670d\u52a1\u5668\u5417\uff1f\u5982\u679c\u60a8\u6709\u7ba1\u7406\u516c\u4f1a\u7684\u670d\u52a1\u5668\u6743\u9650, \u60a8\u53ef\u4ee5\u9080\u8bf7 FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=\u6b63\u786e\u4f7f\u7528\: helpCommandOwnerRestricted=\u6b64\u547d\u4ee4\u4ec5\u9650\u4e8e \n\u673a\u5668\u4eba\u4e3b\u4eba helpConfigCommand=\u663e\u793a\u6b64\u884c\u4f1a\u7684\u914d\u7f6e\u6216\u8c03\u6574\u8bbe\u7f6e\u3002 helpLanguageCommand=\u663e\u793a\u53ef\u7528\u8bed\u8a00\u6216\u4e3a\u8be5\u884c\u4f1a\u8bbe\u7f6e\u8bed\u8a00\u3002 +helpModules=\u663e\u793a\u3001\u542f\u7528\u6216\u7981\u7528\u8be5\u884c\u4f1a\u7684\u547d\u4ee4\u6a21\u5757\u3002 helpHardbanCommand=\u7981\u6b62\u7528\u6237\u5e76\u4ece\u8fc7\u53bb7\u5929\u5185\u5220\u9664\u4ed6\u7684\u90ae\u4ef6\u3002 helpKickCommand=\u4ece\u8fd9\u4e2a\u516c\u4f1a\u4e2d\u8e22\u51fa\u4e00\u4e2a\u7528\u6237\u3002 helpSoftbanCommand=\u7981\u6b62\u7528\u6237\u5e76\u4ece\u8fc7\u53bb7\u5929\u5185\u5220\u9664\u4ed6\u7684\u90ae\u4ef6\u3002 @@ -302,4 +305,20 @@ mathOperationInfinity=\u6570\u5b57\u592a\u5927, \u4e0d\u80fd\u663e\u793a\! prefix=\u524d\u7f00 prefixGuild=\u8fd9\u4e2a\u516c\u4f1a\u7684\u524d\u7f00\u662f{0} prefixShowAgain=\u60a8\u53ef\u4ee5\u968f\u65f6\u901a\u8fc7\u63d0\u53ca\u6211\u6765\u663e\u793a\u524d\u7f00\u3002 +moduleAdmin=\u7ba1\u7406 +moduleInfo=\u95ee\u8be2\u5904 +moduleConfig=\u914d\u7f6e +moduleMusic=\u97f3\u4e50 +moduleModeration=\u7ba1\u7406 +moduleUtility=\u5de5\u5177 +moduleFun=\u6709\u8da3 +moduleLocked={0} \u6a21\u5757\u5df2\u9501\u5b9a\uff0c\u65e0\u6cd5\u542f\u7528/\u7981\u7528\u3002 +moduleCantParse=\u6ca1\u6709\u8fd9\u6837\u7684\u6a21\u5757\u3002\u663e\u793a\u53ef\u7528 {0} \u7684\u53ef\u7528\u6a21\u5757\u5217\u8868 +moduleStatus=\u6a21\u5757\u72b6\u6001 +moduleDisable=\u7981\u7528\u6a21\u5757 +moduleEnable=\u5df2\u542f\u7528\u6a21\u5757{0}\u3002 +moduleShowCommands=\u8bf4 {0} \u67e5\u770b\u6b64\u6a21\u5757\u7684\u547d\u4ee4\u3002 +modulesCommands=\u8bf4 {0} \u663e\u793a\u6a21\u5757\u7684\u547d\u4ee4\uff0c\u6216 {1} \u663e\u793a\u6240\u6709\u547d\u4ee4\u3002 +modulesEnabledInGuild=\u6b64\u516c\u4f1a\u542f\u7528\u6a21\u5757\uff1a +modulesHowTo=\u8bf4{0} \u542f\u7528/\u7981\u7528\u6a21\u5757\u3002 diff --git a/FredBoat/src/main/resources/lang/zh_TW.properties b/FredBoat/src/main/resources/lang/zh_TW.properties index cd97eeb75..2e62a6259 100644 --- a/FredBoat/src/main/resources/lang/zh_TW.properties +++ b/FredBoat/src/main/resources/lang/zh_TW.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=\u64ad\u653e\u5e8f\u5217\u662f\u7a7a\u7684 unpausePlayerNotPaused=\u64ad\u653e\u5668\u4e0d\u662f\u66ab\u505c\u72c0\u614b unpauseNoUsers=\u8a9e\u97f3\u983b\u9053\u76ee\u524d\u6c92\u6709\u7528\u6236 unpauseSuccess=\u64ad\u653e\u5668\u5df2\u53d6\u6d88\u66ab\u505c -volumeApology=\u5f88\u62b1\u6b49\! ;;volume \u6307\u4ee4\u5df2\u7d93\u5728\u516c\u958b\u7684\u97f3\u6a02Bot\u505c\u7528\u3002\u9019\u662f\u56e0\u70ba\u4ed6\u6703\u5728\u8655\u7406\u97f3\u8a0a\u6642\u82b1\u4e0a\u5927\u91cf\u7684\u6642\u9593,\u6709\u4e00\u4e9b\u66f2\u76ee\u9084\u6703\u82b1\u4e0a\u4e94\u500d\u4e4b\u4e45,\u8b93\u5927\u5bb6\u807d\u5f97\u5f88\u5403\u529b\u3002\u5728\u505c\u7528\u6b64\u529f\u80fd\u5f8c\u53ef\u4ee5\u5728\u4e0d\u5361\u7684\u60c5\u6cc1\u4e0b\u807d\u97f3\u6a02\u3002\n\u6211\u5efa\u8b70\u900f\u904e\u4e0b\u62c9\u5f0f\u9078\u55ae https\://fred.moe/1vD.png \u8abf\u6574Bot\u7684\u97f3\u91cf +volumeApology=Sorry\! The volume command is not available for use on the public Fredboat. Adjusting the audio volume heavily increases CPU load which is too expensive a feature to be supported on a wildly popular music bot. You can turn the volume down by right clicking (or tapping for mobile users) on it in the voice channel and using the slider. If you'd like to have a volume command and some extra awesome features, check out how to become a Patron and gain access to an exclusive bot here\: volumeSyntax=\u4f7f\u7528 `;;volume <0-150>` \u9810\u8a2d\u503c\u662f {0}%\n\u64ad\u653e\u5668\u76ee\u524d\u5728 **{1}%**. volumeSuccess=\u97f3\u91cf\u5df2\u5f9e * *{0}%* * \u8abf\u6574\u5230 * *{1}%* * exportEmpty=\u6c92\u6709\u751a\u9ebc\u6771\u897f\u53ef\u532f\u51fa\uff0c\u56e0\u70ba\u64ad\u653e\u5e8f\u5217\u662f\u7a7a\u7684 @@ -127,6 +127,7 @@ luaTimeout=\ \u529f\u80fd\u903e\u6642 \:anger\: \u5141\u8a31\u7684\u8a08\u7b97\u helpSuccess=\u6587\u4ef6\u5df2\u7d93\u79c1\u8a0a\u7d66\u4f60 helpDmFailed=\u7121\u6cd5\u50b3\u9001\u6587\u4ef6\u81f3\u79c1\u8a0a\uff0c\u8acb\u78ba\u8a8d\u4f60\u6709\u958b\u555f\u5b83\u3002 helpCommandsPromotion=\u8aaa {0} \u4ee5\u719f\u77e5\u9019\u500b\u6a5f\u5668\u4eba\u80fd\u505a\u751a\u9ebc\! +musicCommandsPromotion=\u8aaa{0} \u4f86\u67e5\u770b\u97f3\u6a02\u547d\u4ee4\u7684\u5b8c\u6574\u5217\u8868\u3002 fuzzyNoResults=\u7121\u6b64\u7528\u6236 brainfuckCycleLimit=\u7a0b\u5f0f\u5df2\u9054\u5230 {0} \u7684\u6700\u5927\u904b\u7b97\u9031\u671f brainfuckDataPointerOutOfBounds=\u8cc7\u6599\u6307\u6a19\u8d85\u51fa\u7bc4\u570d\uff1a{0} @@ -211,6 +212,7 @@ commandsModeration=\u7ba1\u7406 commandsMaintenance=\u7dad\u8b77 commandsBotOwner=Bot \u64c1\u6709\u8005 commandsMoreHelp=\u8aaa {0} \u4ee5\u7372\u5f97\u7279\u5b9a\u6307\u4ee4\u7684\u66f4\u591a\u8cc7\u8a0a +commandsModulesHint=\u60a8\u53ef\u4ee5\u4f7f\u7528{0} \u555f\u7528\u548c\u7981\u7528\u5176\u4ed6\u6a21\u584a helpUnknownCommand=\u672a\u77e5\u7684\u6307\u4ee4 helpDocsLocation=\u627e\u4e0d\u5230\u6587\u4ef6 helpBotInvite=\u8981\u5c07 FredBoat \u6dfb\u52a0\u5230\u60a8\u7684\u4f3a\u670d\u5668\u55ce\uff1f\u5982\u679c\u60a8\u6709\u7ba1\u7406\u516c\u6703\u7684\u4f3a\u670d\u5668\u8a31\u53ef\u6b0a, \u60a8\u53ef\u4ee5\u9080\u8acb FredBoat\: @@ -222,6 +224,7 @@ helpProperUsage=\u6b63\u78ba\u7528\u6cd5\: helpCommandOwnerRestricted=\u6b64\u6307\u4ee4\u53ea\u9650Bot\u7684\u64c1\u6709\u8005\u4f7f\u7528 helpConfigCommand=\u986f\u793a\u6216\u8abf\u6574\u516c\u6703\u7684\u8a2d\u5b9a helpLanguageCommand=\u986f\u793a\u6216\u8abf\u6574\u6b64\u516c\u6703\u9069\u7528\u7684\u8a9e\u8a00 +helpModules=\u986f\u793a\uff0c\u555f\u7528\u6216\u7981\u7528\u8a72\u516c\u6703\u7684\u547d\u4ee4\u6a21\u584a\u3002 helpHardbanCommand=\u5c01\u9396\u4f7f\u7528\u8005\u4e26\u522a\u9664\u6b64\u4f7f\u7528\u8005\u4e03\u5929\u5167\u7684\u4fe1\u606f helpKickCommand=\u5f9e\u516c\u6703\u8e22\u9664\u4f7f\u7528\u8005 helpSoftbanCommand=\u66ab\u6642\u5c01\u9396\u4e26\u8e22\u9664\u4f7f\u7528\u8005\uff0c\u4e26\u522a\u9664\u6b64\u4f7f\u7528\u8005\u4e03\u5929\u5167\u7684\u4fe1\u606f @@ -274,7 +277,7 @@ helpMathOperationPow=\u5217\u5370 num1 \u548c num2 \u7684\u7e3d\u548c\u3002 destroyDenied=\u60a8\u5fc5\u9808\u5177\u6709\u7ba1\u7406\u6b0a\u7dda\u624d\u53ef\u91cd\u7f6e\u73a9\u5bb6\u3002 destroyHelp=\u91cd\u7f6e\u64ad\u653e\u5668\u4e26\u6e05\u9664\u64ad\u653e\u6e05\u55ae\u3002\u4fdd\u7559\u7d66\u53ef\u4ee5\u7ba1\u7406\u4fe1\u606f\u7684\u7ba1\u7406\u54e1 destroySucc=\u91cd\u7f6e\u73a9\u5bb6\u548c\u6e05\u9664\u4f47\u5217\u3002 -listPageNum=\u9801 **{0} **{1} **\u3002 +listPageNum=\u9801 **{0}** / **{1} **\u3002 permsListTitle=\u5177\u6709{0} \u8a31\u53ef\u6b0a\u7684\u4f7f\u7528\u8005\u548c\u89d2\u8272 permsAdded=\u589e\u52a0\u4e86 ''{0} '' \u5230 ''{1} ''\u3002 permsRemoved=\u5df2\u5f9e "{1}" \u4e2d\u522a\u9664 "{0}"\u3002 @@ -302,4 +305,20 @@ mathOperationInfinity=\u6578\u5b57\u904e\u5927\u7121\u6cd5\u986f\u793a\! prefix=\u9996\u78bc prefixGuild=\u9019\u500b\u516c\u6703\u7684\u9996\u78bc\u662f{0} prefixShowAgain=\u60a8\u53ef\u4ee5\u96a8\u6642\u901a\u904e\u63d0\u53ca\u6211\u4f86\u986f\u793a\u9996\u78bc\u3002 +moduleAdmin=\u7ba1\u7406\u54e1 +moduleInfo=\u8cc7\u8a0a +moduleConfig=\u8a2d\u5b9a +moduleMusic=\u97f3\u6a02 +moduleModeration=\u7ba1\u7406 +moduleUtility=\u5de5\u5177 +moduleFun=\u8da3\u5473 +moduleLocked={0} \u6a21\u584a\u88ab\u9396\u5b9a\uff0c\u7121\u6cd5\u555f\u7528/\u7981\u7528\u3002 +moduleCantParse=\u6c92\u6709\u9019\u6a23\u7684\u6a21\u584a\u3002 \u7528{0} \u986f\u793a\u53ef\u7528\u6a21\u584a\u7684\u5217\u8868 +moduleStatus=\u6a21\u7d44\u72c0\u614b +moduleDisable=\u5df2\u505c\u7528\u6a21\u7d44 {0}\u3002 +moduleEnable=\u5df2\u555f\u7528\u6a21\u7d44 {0}\u3002 +moduleShowCommands=\u8aaa{0} \u4f86\u67e5\u770b\u9019\u500b\u6a21\u584a\u7684\u547d\u4ee4\u3002 +modulesCommands=\u8aaa{0} \u4f86\u986f\u793a\u4e00\u500b\u6a21\u584a\u7684\u547d\u4ee4\uff0c\u6216\u8005{1} \u4f86\u986f\u793a\u6240\u6709\u7684\u547d\u4ee4\u3002 +modulesEnabledInGuild=\u70ba\u9019\u500b\u516c\u6703\u555f\u7528\u6a21\u584a\uff1a +modulesHowTo=\u8aaa{0} \u555f\u7528/\u7981\u7528\u6a21\u7d44\u3002 diff --git a/FredBoat/src/test/java/fredboat/commandmeta/CommandInitializerTest.java b/FredBoat/src/test/java/fredboat/commandmeta/CommandInitializerTest.java index ee9f11d82..4817399d6 100644 --- a/FredBoat/src/test/java/fredboat/commandmeta/CommandInitializerTest.java +++ b/FredBoat/src/test/java/fredboat/commandmeta/CommandInitializerTest.java @@ -3,8 +3,6 @@ import fredboat.FakeContext; import fredboat.ProvideJDASingleton; import fredboat.commandmeta.abs.Command; -import fredboat.commandmeta.init.MainCommandInitializer; -import fredboat.commandmeta.init.MusicCommandInitializer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -28,11 +26,10 @@ public static void saveStats() { public void testHelpStrings() { // Assumptions.assumeFalse(isTravisEnvironment(), () -> "Aborting test: Travis CI detected"); - MainCommandInitializer.initCommands(); - MusicCommandInitializer.initCommands(); + CommandInitializer.initCommands(); - for (String c : CommandRegistry.getRegisteredCommandsAndAliases()) { - Command com = CommandRegistry.getCommand(c).command; + for (String c : CommandRegistry.getAllRegisteredCommandsAndAliases()) { + Command com = CommandRegistry.findCommand(c); String help = com.help(new FakeContext(testChannel, testSelfMember, testGuild)); Assertions.assertNotNull(help, () -> com.getClass().getName() + ".help() returns null"); diff --git a/README.md b/README.md index 484a83176..6befdf590 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![FredBoat](https://fred.moe/YY1.png) -# FredBoat [![Build Status](https://travis-ci.org/Frederikam/FredBoat.svg?branch=master)](https://travis-ci.org/Frederikam/FredBoat) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/fredboat/localized.svg)](https://crowdin.com/project/fredboat) [![Twitter Follow](https://img.shields.io/twitter/follow/DiscordFredBoat.svg?style=social&label=Follow)]() +# FredBoat [![TeamCity (simple build status)](https://img.shields.io/teamcity/https/ci.fredboat.com/s/FredBoat_Build.svg)](https://ci.fredboat.com/viewType.html?buildTypeId=FredBoat_Build&guest=1) [![Github commits (since latest release)](https://img.shields.io/github/commits-since/Frederikam/FredBoat/latest.svg)]() [![Crowdin](https://d322cqt584bo4o.cloudfront.net/fredboat/localized.svg)](https://crowdin.com/project/fredboat) [![Twitter Follow](https://img.shields.io/twitter/follow/DiscordFredBoat.svg?style=social&label=Follow)]() FredBoat is a bot that has various features, but most notably is that it can play music. Pull requests are welcome and please report any issues you find in [issues](https://github.com/Frederikam/FredBoat/issues). FredBoat is licensed under the MIT license, so feel free to copy small or large parts of the code here without having to ask. I would love to see what you can create with it! @@ -10,7 +10,9 @@ FredBoat is licensed under the MIT license, so feel free to copy small or large ## Documentation Help can be found at [https://fredboat.com/docs](https://fredboat.com/docs). -For installation instructions, go to [https://fredboat.com/docs/selfhosting](https://fredboat.com/docs/selfhosting). +For installation instructions, go to [https://fredboat.com/docs/selfhosting](https://fredboat.com/docs/selfhosting). The recommended method of installation is Docker. + +[![Docker Pulls](https://img.shields.io/docker/pulls/fredboat/fredboat.svg)](https://fredboat.com/docs/selfhosting) [![Docker layers](https://images.microbadger.com/badges/image/fredboat/fredboat:dev.svg)](https://microbadger.com/images/fredboat/fredboat:dev "Get your own image badge on microbadger.com") ## Contributing If you are interested, you can read about contributing to this project [here](https://github.com/Frederikam/FredBoat/blob/master/CONTRIBUTING.md). diff --git a/Shared/src/main/java/fredboat/shared/constant/BotConstants.java b/Shared/src/main/java/fredboat/shared/constant/BotConstants.java index 655c9dc4a..2e369d813 100644 --- a/Shared/src/main/java/fredboat/shared/constant/BotConstants.java +++ b/Shared/src/main/java/fredboat/shared/constant/BotConstants.java @@ -42,6 +42,8 @@ public class BotConstants { public static final String DOCS_PERMISSIONS_URL = DOCS_URL + "/permissions"; public static final String DOCS_DONATE_URL = DOCS_URL + "/donate"; + public static final String GITHUB_URL = "https://github.com/Frederikam/FredBoat"; + //These can be set using eval in case we need to change it in the future ~Fre_d public static String hangoutInvite = "https://discord.gg/cgPFW4q"; public static String botInvite = "https://goo.gl/cFs5M9"; diff --git a/docker-compose.yml b/docker-compose.yml index 948fd2acd..146eed5c6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,6 +20,8 @@ services: db: image: fredboat/postgres restart: always + labels: + - "com.centurylinklabs.watchtower.enable=true" # WINDOWS ONLY: if you are running under windows you need to comment out the following two lines: volumes: @@ -40,6 +42,8 @@ services: image: fredboat/fredboat:stable #image: fredboat/fredboat:dev restart: on-failure:3 + labels: + - "com.centurylinklabs.watchtower.enable=true" depends_on: - db ports: @@ -49,6 +53,14 @@ services: - ./credentials.yaml:/opt/FredBoat/credentials.yaml - ./logs:/opt/FredBoat/logs - ./music_persistence:/opt/FredBoat/music_persistence + # Local audio files (dev branch only currently) + # If your music directory looks like this: /home/user/music/directory/rickroll.mp3 or C:\Users\user\Music\rickroll.mp3 + # you will be able to play that file with this command: <