diff --git a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs index 78de87e6..39c749d2 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs @@ -28,7 +28,7 @@ namespace NadekoBot.Modules.Gambling var ar = new AnimalRace(Context.Guild.Id, (ITextChannel)Context.Channel, Prefix); if (ar.Fail) - await Context.Channel.SendErrorAsync("🏁 `Failed starting a race. Another race is probably running.`").ConfigureAwait(false); + await ReplyErrorLocalized("race_failed_starting").ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] @@ -43,7 +43,7 @@ namespace NadekoBot.Modules.Gambling AnimalRace ar; if (!AnimalRaces.TryGetValue(Context.Guild.Id, out ar)) { - await Context.Channel.SendErrorAsync("No race exists on this server").ConfigureAwait(false); + await ReplyErrorLocalized("race_not_exist").ConfigureAwait(false); return; } await ar.JoinRace(Context.User as IGuildUser, amount); @@ -56,22 +56,22 @@ namespace NadekoBot.Modules.Gambling public bool Fail { get; set; } - public List participants = new List(); - private ulong serverId; - private int messagesSinceGameStarted = 0; + private readonly List _participants = new List(); + private readonly ulong _serverId; + private int _messagesSinceGameStarted; private readonly string _prefix; - private Logger _log { get; } + private readonly Logger _log; - public ITextChannel raceChannel { get; set; } - public bool Started { get; private set; } = false; + private readonly ITextChannel _raceChannel; + public bool Started { get; private set; } public AnimalRace(ulong serverId, ITextChannel ch, string prefix) { - this._prefix = prefix; - this._log = LogManager.GetCurrentClassLogger(); - this.serverId = serverId; - this.raceChannel = ch; + _prefix = prefix; + _log = LogManager.GetCurrentClassLogger(); + _serverId = serverId; + _raceChannel = ch; if (!AnimalRaces.TryAdd(serverId, this)) { Fail = true; @@ -90,8 +90,8 @@ namespace NadekoBot.Modules.Gambling { try { - await raceChannel.SendConfirmAsync("Animal Race", $"Starting in 20 seconds or when the room is full.", - footer: $"Type {_prefix}jr to join the race."); + await _raceChannel.SendConfirmAsync(GetText("animal_race"), GetText("animal_race_starting"), + footer: GetText("animal_race_join_instr", _prefix)); } catch (Exception ex) { @@ -102,16 +102,16 @@ namespace NadekoBot.Modules.Gambling cancelSource.Cancel(); if (t == fullgame) { - try { await raceChannel.SendConfirmAsync("Animal Race", "Full! Starting immediately."); } catch (Exception ex) { _log.Warn(ex); } + try { await _raceChannel.SendConfirmAsync(GetText("animal_race"), GetText("animal_race_full") ); } catch (Exception ex) { _log.Warn(ex); } } - else if (participants.Count > 1) + else if (_participants.Count > 1) { - try { await raceChannel.SendConfirmAsync("Animal Race", "Starting with " + participants.Count + " participants."); } catch (Exception ex) { _log.Warn(ex); } + try { await _raceChannel.SendConfirmAsync(GetText("animal_race"), GetText("animal_race_starting_with_x", _participants.Count)); } catch (Exception ex) { _log.Warn(ex); } } else { - try { await raceChannel.SendErrorAsync("Animal Race", "Failed to start since there was not enough participants."); } catch (Exception ex) { _log.Warn(ex); } - var p = participants.FirstOrDefault(); + try { await _raceChannel.SendErrorAsync(GetText("animal_race"), GetText("animal_race_failed")); } catch (Exception ex) { _log.Warn(ex); } + var p = _participants.FirstOrDefault(); if (p != null && p.AmountBet > 0) await CurrencyHandler.AddCurrencyAsync(p.User, "BetRace", p.AmountBet, false).ConfigureAwait(false); @@ -128,7 +128,7 @@ namespace NadekoBot.Modules.Gambling private void End() { AnimalRace throwaway; - AnimalRaces.TryRemove(serverId, out throwaway); + AnimalRaces.TryRemove(_serverId, out throwaway); } private async Task StartRace() @@ -136,21 +136,21 @@ namespace NadekoBot.Modules.Gambling var rng = new NadekoRandom(); Participant winner = null; IUserMessage msg = null; - int place = 1; + var place = 1; try { NadekoBot.Client.MessageReceived += Client_MessageReceived; - while (!participants.All(p => p.Total >= 60)) + while (!_participants.All(p => p.Total >= 60)) { //update the state - participants.ForEach(p => + _participants.ForEach(p => { p.Total += 1 + rng.Next(0, 10); }); - participants + _participants .OrderByDescending(p => p.Total) .ForEach(p => { @@ -170,14 +170,14 @@ namespace NadekoBot.Modules.Gambling //draw the state var text = $@"|🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🔚| -{String.Join("\n", participants.Select(p => $"{(int)(p.Total / 60f * 100),-2}%|{p.ToString()}"))} +{String.Join("\n", _participants.Select(p => $"{(int)(p.Total / 60f * 100),-2}%|{p.ToString()}"))} |🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🔚|"; - if (msg == null || messagesSinceGameStarted >= 10) // also resend the message if channel was spammed + if (msg == null || _messagesSinceGameStarted >= 10) // also resend the message if channel was spammed { if (msg != null) try { await msg.DeleteAsync(); } catch { } - messagesSinceGameStarted = 0; - try { msg = await raceChannel.SendMessageAsync(text).ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } + _messagesSinceGameStarted = 0; + try { msg = await _raceChannel.SendMessageAsync(text).ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } } else { @@ -187,22 +187,33 @@ namespace NadekoBot.Modules.Gambling await Task.Delay(2500); } } - catch { } + catch + { + // ignored + } finally { NadekoBot.Client.MessageReceived -= Client_MessageReceived; } - if (winner.AmountBet > 0) + if (winner != null) { - var wonAmount = winner.AmountBet * (participants.Count - 1); + if (winner.AmountBet > 0) + { + var wonAmount = winner.AmountBet * (_participants.Count - 1); - await CurrencyHandler.AddCurrencyAsync(winner.User, "Won a Race", wonAmount, true).ConfigureAwait(false); - await raceChannel.SendConfirmAsync("Animal Race", $"{winner.User.Mention} as {winner.Animal} **Won the race and {wonAmount}{CurrencySign}!**").ConfigureAwait(false); - } - else - { - await raceChannel.SendConfirmAsync("Animal Race", $"{winner.User.Mention} as {winner.Animal} **Won the race!**").ConfigureAwait(false); + await CurrencyHandler.AddCurrencyAsync(winner.User, "Won a Race", wonAmount, true) + .ConfigureAwait(false); + await _raceChannel.SendConfirmAsync(GetText("animal_race"), + Format.Bold(GetText("animal_race_won_money", winner.User.Mention, + winner.Animal, wonAmount + CurrencySign))) + .ConfigureAwait(false); + } + else + { + await _raceChannel.SendConfirmAsync(GetText("animal_race"), + Format.Bold(GetText("animal_race_won", winner.User.Mention, winner.Animal))).ConfigureAwait(false); + } } } @@ -212,9 +223,9 @@ namespace NadekoBot.Modules.Gambling var msg = imsg as SocketUserMessage; if (msg == null) return Task.CompletedTask; - if (msg.IsAuthor() || !(imsg.Channel is ITextChannel) || imsg.Channel != raceChannel) + if (msg.IsAuthor() || !(imsg.Channel is ITextChannel) || imsg.Channel != _raceChannel) return Task.CompletedTask; - messagesSinceGameStarted++; + _messagesSinceGameStarted++; return Task.CompletedTask; } @@ -228,51 +239,66 @@ namespace NadekoBot.Modules.Gambling public async Task JoinRace(IGuildUser u, int amount = 0) { - var animal = ""; + string animal; if (!animals.TryDequeue(out animal)) { - await raceChannel.SendErrorAsync($"{u.Mention} `There is no running race on this server.`").ConfigureAwait(false); + await _raceChannel.SendErrorAsync(GetText("animal_race_no_race")).ConfigureAwait(false); return; } var p = new Participant(u, animal, amount); - if (participants.Contains(p)) + if (_participants.Contains(p)) { - await raceChannel.SendErrorAsync($"{u.Mention} `You already joined this race.`").ConfigureAwait(false); + await _raceChannel.SendErrorAsync(GetText("animal_race_already_in")).ConfigureAwait(false); return; } if (Started) { - await raceChannel.SendErrorAsync($"{u.Mention} `Race is already started`").ConfigureAwait(false); + await _raceChannel.SendErrorAsync(GetText("animal_race_already_started")).ConfigureAwait(false); return; } if (amount > 0) - if (!await CurrencyHandler.RemoveCurrencyAsync((IGuildUser)u, "BetRace", amount, false).ConfigureAwait(false)) + if (!await CurrencyHandler.RemoveCurrencyAsync(u, "BetRace", amount, false).ConfigureAwait(false)) { - try { await raceChannel.SendErrorAsync($"{u.Mention} You don't have enough {NadekoBot.BotConfig.CurrencyPluralName}.").ConfigureAwait(false); } catch { } + await _raceChannel.SendErrorAsync(GetText("not_enough", CurrencySign)).ConfigureAwait(false); return; } - participants.Add(p); - await raceChannel.SendConfirmAsync("Animal Race", $"{u.Mention} **joined as a {p.Animal}" + (amount > 0 ? $" and bet {amount} {CurrencySign}!**" : "**")) - .ConfigureAwait(false); + _participants.Add(p); + string confStr; + if (amount > 0) + confStr = GetText("animal_race_join_bet", u.Mention, p.Animal, amount + CurrencySign); + else + confStr = GetText("animal_race_join", u.Mention, p.Animal); + await _raceChannel.SendConfirmAsync(GetText("animal_race"), Format.Bold(confStr)).ConfigureAwait(false); } + + private string GetText(string text) + => NadekoModule.GetTextStatic(text, + NadekoBot.Localization.GetCultureInfo(_raceChannel.Guild), + typeof(Gambling).Name.ToLowerInvariant()); + + private string GetText(string text, params object[] replacements) + => NadekoModule.GetTextStatic(text, + NadekoBot.Localization.GetCultureInfo(_raceChannel.Guild), + typeof(Gambling).Name.ToLowerInvariant(), + replacements); } public class Participant { - public IGuildUser User { get; set; } - public string Animal { get; set; } - public int AmountBet { get; set; } + public IGuildUser User { get; } + public string Animal { get; } + public int AmountBet { get; } public float Coeff { get; set; } public int Total { get; set; } - public int Place { get; set; } = 0; + public int Place { get; set; } public Participant(IGuildUser u, string a, int amount) { - this.User = u; - this.Animal = a; - this.AmountBet = amount; + User = u; + Animal = a; + AmountBet = amount; } public override int GetHashCode() => User.GetHashCode(); @@ -288,23 +314,13 @@ namespace NadekoBot.Modules.Gambling var str = new string('‣', Total) + Animal; if (Place == 0) return str; - if (Place == 1) - { - return str + "🏆"; - } - else if (Place == 2) - { - return str + "`2nd`"; - } - else if (Place == 3) - { - return str + "`3rd`"; - } - else - { - return str + $"`{Place}th`"; - } + str += $"`#{Place}`"; + + if (Place == 1) + str += "🏆"; + + return str; } } } diff --git a/src/NadekoBot/Modules/Gambling/Gambling.cs b/src/NadekoBot/Modules/Gambling/Gambling.cs index acceab4e..3cdd7165 100644 --- a/src/NadekoBot/Modules/Gambling/Gambling.cs +++ b/src/NadekoBot/Modules/Gambling/Gambling.cs @@ -240,9 +240,7 @@ namespace NadekoBot.Modules.Gambling (int) (amount * NadekoBot.BotConfig.Betroll100Multiplier), false).ConfigureAwait(false); } } - Console.WriteLine("started sending"); await Context.Channel.SendConfirmAsync(str).ConfigureAwait(false); - Console.WriteLine("done sending"); } [NadekoCommand, Usage, Description, Aliases] diff --git a/src/NadekoBot/Modules/Games/Commands/Hangman/HangmanGame.cs b/src/NadekoBot/Modules/Games/Commands/Hangman/HangmanGame.cs index 6ccbcb9b..b4b18e97 100644 --- a/src/NadekoBot/Modules/Games/Commands/Hangman/HangmanGame.cs +++ b/src/NadekoBot/Modules/Games/Commands/Hangman/HangmanGame.cs @@ -9,8 +9,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; +using NadekoBot.Modules.Games.Commands.Hangman; -namespace NadekoBot.Modules.Games.Commands.Hangman +namespace NadekoBot.Modules.Games.Hangman { public class HangmanTermPool { diff --git a/src/NadekoBot/Modules/Games/Commands/HangmanCommands.cs b/src/NadekoBot/Modules/Games/Commands/HangmanCommands.cs index 83637a62..f3f09da0 100644 --- a/src/NadekoBot/Modules/Games/Commands/HangmanCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/HangmanCommands.cs @@ -6,6 +6,7 @@ using NLog; using System; using System.Collections.Concurrent; using System.Threading.Tasks; +using NadekoBot.Modules.Games.Hangman; namespace NadekoBot.Modules.Games { diff --git a/src/NadekoBot/Resources/ResponseStrings.Designer.cs b/src/NadekoBot/Resources/ResponseStrings.Designer.cs index 78867fa4..84439a80 100644 --- a/src/NadekoBot/Resources/ResponseStrings.Designer.cs +++ b/src/NadekoBot/Resources/ResponseStrings.Designer.cs @@ -2072,6 +2072,96 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Animal Race. + /// + public static string gambling_animal_race { + get { + return ResourceManager.GetString("gambling_animal_race", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to start since there was not enough participants.. + /// + public static string gambling_animal_race_failed { + get { + return ResourceManager.GetString("gambling_animal_race_failed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Race is full! Starting immediately.. + /// + public static string gambling_animal_race_full { + get { + return ResourceManager.GetString("gambling_animal_race_full", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} joined as a {1}. + /// + public static string gambling_animal_race_join { + get { + return ResourceManager.GetString("gambling_animal_race_join", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} joined as a {1} and bet {2}!. + /// + public static string gambling_animal_race_join_bet { + get { + return ResourceManager.GetString("gambling_animal_race_join_bet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type {0}jr to join the race.. + /// + public static string gambling_animal_race_join_instr { + get { + return ResourceManager.GetString("gambling_animal_race_join_instr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starting in 20 seconds or when the room is full.. + /// + public static string gambling_animal_race_starting { + get { + return ResourceManager.GetString("gambling_animal_race_starting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starting with {0} participants.. + /// + public static string gambling_animal_race_starting_with_x { + get { + return ResourceManager.GetString("gambling_animal_race_starting_with_x", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} as {1} Won the race!. + /// + public static string gambling_animal_race_won { + get { + return ResourceManager.GetString("gambling_animal_race_won", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} as {1} Won the race and {2}!. + /// + public static string gambling_animal_race_won_money { + get { + return ResourceManager.GetString("gambling_animal_race_won_money", resourceCulture); + } + } + /// /// Looks up a localized string similar to has awarded {0} to {1}. /// @@ -2252,6 +2342,24 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Failed starting the race. Another race is probably running.. + /// + public static string gambling_race_failed_starting { + get { + return ResourceManager.GetString("gambling_race_failed_starting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No race exists on this server. + /// + public static string gambling_race_not_exist { + get { + return ResourceManager.GetString("gambling_race_not_exist", resourceCulture); + } + } + /// /// Looks up a localized string similar to Raffled User. /// diff --git a/src/NadekoBot/Resources/ResponseStrings.resx b/src/NadekoBot/Resources/ResponseStrings.resx index 1afc5b8b..8cc5fc3d 100644 --- a/src/NadekoBot/Resources/ResponseStrings.resx +++ b/src/NadekoBot/Resources/ResponseStrings.resx @@ -1043,4 +1043,40 @@ Don't forget to leave your discord name or id in the message. Tag + + Animal Race + + + Failed to start since there was not enough participants. + + + Race is full! Starting immediately. + + + {0} joined as a {1} + + + {0} joined as a {1} and bet {2}! + + + Type {0}jr to join the race. + + + Starting in 20 seconds or when the room is full. + + + Starting with {0} participants. + + + {0} as {1} Won the race! + + + {0} as {1} Won the race and {2}! + + + Failed starting the race. Another race is probably running. + + + No race exists on this server + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.sr-cyrl-rs.resx b/src/NadekoBot/Resources/ResponseStrings.sr-cyrl-rs.resx index 86b7aa87..8d58263b 100644 --- a/src/NadekoBot/Resources/ResponseStrings.sr-cyrl-rs.resx +++ b/src/NadekoBot/Resources/ResponseStrings.sr-cyrl-rs.resx @@ -250,9 +250,6 @@ Рат против {0} је започет! - - је **УНИШТИО** базу #{0} у рату против {1} - Сва статистика Реакција по Избору је обрисана. @@ -359,10 +356,691 @@ АутоХентаи заустављен. - - Нема резултата. - Таг + + **DESTROYED** base #{0} in a war against {1} + + + No results found. + + + **Auto assign role** on user join is now **disabled**. + + + **Auto assign role** on user join is now **enabled**. + + + Attachments + + + Avatar Changed + + + You have been banned from {0} server. +Reason: {1} + + + banned + PLURAL + + + User Banned + + + Bot name changed to {0} + + + Bot status changed to {0} + + + Automatic deletion of bye messages has been disabled. + + + Bye messages will be deleted after {0} seconds. + + + Current bye message: {0} + + + Enable bye messages by typing {0} + + + New bye message set. + + + Bye announcements disabled. + + + Bye announcements enabled on this channel. + + + Channel Name Changed + + + Old Name + + + Channel Topic Changed + + + Cleaned up. + + + Content + + + Sucessfully created role {0} + + + Text channel {0} created. + + + Voice channel {0} created. + + + Deafen successful. + + + Deleted server {0} + + + Stopped automatic deletion of successful command invokations. + + + Now automatically deleting sucessful command invokations. + + + Text channel {0} deleted. + + + Voice channel {0} deleted. + + + DM from + + + Sucessfully added a new donator.Total donated amount from this user: {0} 👑 + + + Thanks to the people listed below for making this project hjappen! + + + I will forward DMs to all owners. + + + I will forward DMs only to the first owner. + + + I will forward DMs from now on. + + + I will stop forwarding DMs from now on. + + + Automatic deletion of greet messages has been disabled. + + + Greet messages will be deleted after {0} seconds. + + + Current DM greet message: {0} + + + Enable DM greet messages by typing {0} + + + New DM greet message set. + + + DM greet announcements disabled. + + + DM greet announcements enabled. + + + Current greet message: {0} + + + Enable greet messages by typing {0} + + + New greet message set. + + + Greet announcements disabled. + + + Greet announcements enabled on this channel. + + + You can't use this command on users with a role higher or equal to yours in the role hierarchy. + + + Images loaded after {0} seconds! + + + Invalid input format. + + + Invalid parameters. + + + {0} has joined {1} + + + You have been kicked from {0} server. +Reason: {1} + + + User Kicked + + + List Of Languages +{0} + + + Your server's locale is now {0} - {1} + + + Bot's default locale is now {0} - {1} + + + Bot's language is set to {0} - {0} + + + Failed setting locale. Revisit this command's help. + + + This server's language is set to {0} - {0} + + + {0} has left {1} + + + Left server {0} + + + Logging {0} event in this channel. + + + Logging all events in this channel. + + + Logging disabled. + + + Log events you can subscribe to: + + + Logging will ignore {0} + + + Logging will not ignore {0} + + + Stopped logging {0} event. + + + {0} has invoked a mention on the following roles + + + Message from {0} `[Bot Owner]`: + + + Message sent. + + + {0} moved from {1} to {2} + + + Message Deleted in #{0} + + + Message Updated in #{0} + + + Muted + PLURAL (users have been muted) + + + Muted + singular "User muted." + + + I don't have the permission necessary for that most likely. + + + New mute role set. + + + I need **Administration** permission to do that. + + + New Message + + + New Nickname + + + New Topic + + + Nickname Changed + + + Can't find that server + + + No shard with that ID found. + + + Old Message + + + Old Nickname + + + Old Topic + + + Error. Most likely I don't have sufficient permissions. + + + Permissions for this server are reset. + + + Active Protections + + + {0} has been **disabled** on this server. + + + {0} Enabled + + + Error. I need ManageRoles permission + + + No protections enabled. + + + User threshold must be between {0} and {1}. + + + If {0} or more users join within {1} seconds, I will {2} them. + + + Time must be between {0} and {1} seconds. + + + Successfully removed all roles from user {0} + + + Failed to remove roles. I have insufficient permissions. + + + Color of {0} role has been changed. + + + That role does not exist. + + + The parameters specified are invalid. + + + Error occured due to invalid color or insufficient permissions. + + + Successfully removed role {0} from user {1} + + + Failed to remove role. I have insufficient permissions. + + + Role renamed. + + + Failed to rename role. I have insufficient permissions. + + + You can't edit roles higher than your highest role. + + + Removed the playing message: {0} + + + Role {0} as been added to the list. + + + {0} not found.Cleaned up. + + + Role {0} is already in the list. + + + Added. + + + Rotating playing status disabled. + + + Rotating playing status enabled. + + + Here is a list of rotating statuses: +{0} + + + No rotating playing statuses set. + + + You already have {0} role. + + + You already have {0} exclusive self-assigned role. + + + Self assigned roles are now exclusive! + + + There are {0} self assignable roles + + + That role is not self-assignable. + + + You don't have {0} role. + + + Self assigned roles are now not exclusive! + + + I am unable to add that role to you. `I can't add roles to owners or other roles higher than my role in the role hierarchy.` + + + {0} has been removed from the list of self-assignable roles. + + + You no longer have {0} role. + + + You now have {0} role. + + + Sucessfully added role {0} to user {1} + + + Failed to add role. I have insufficient permissions. + + + New avatar set! + + + New channel name set. + + + New game set! + + + New stream set! + + + New channel topic set. + + + Shard {0} reconnected. + + + Shard {0} reconnecting. + + + Shutting down + + + Users can't send more than {0} messages every {1} seconds. + + + Slow mode disabled. + + + Slow mode initiated + + + soft-banned (kicked) + PLURAL + + + {0} will ignore this channel. + + + {0} will no longer ignore this channel. + + + If a user posts {0} same messages in a row, I will {1} them. + __IgnoredChannels__: {2} + + + Text Channel Destroyed + + + Text Channel Destroyed + + + Undeafen successful. + + + Unmuted + singular + + + Username + + + Username Changed + + + Users + + + User Banned + + + {0} has been **muted** from chatting. + + + {0} has been **unmuted** from chatting. + + + User Joined + + + User Left + + + {0} has been **muted** from text and voice chat. + + + User's Role Added + + + User's Role Removed + + + {0} is now {1} + + + {0} has been **unmuted** from text and voice chat. + + + {0} has joined {1} voice channel. + + + {0} has left {1} voice channel. + + + {0} moved from {1} to {2} voice channel. + + + {0} has been **voice muted**. + + + {0} has been **voice unmuted**. + + + Voice Channel Destroyed + + + Voice Channel Destroyed + + + Disabled voice + text feature. + + + Enabled voice + text feature. + + + I don't have **manage roles** and/or **manage channels** permission, so I cannot run `voice+text` on {0} server. + + + You are enabling/disabling this feature and **I do not have ADMINISTRATOR permissions**. This may cause some issues, and you will have to clean up text channels yourself afterwards. + + + I require atleast **manage roles** and **manage channels** permissions to enable this feature. (preffered Administration permission) + + + User {0} from text chat + + + User {0} from text and voice chat + + + User {0} from voice chat + + + You have been soft-banned from {0} server. +Reason: {1} + + + User Unbanned + + + Migration done! + + + Error while migrating, check bot's console for more information. + + + Presence Updates + + + User Soft-Banned + + + has awarded {0} to {1} + + + Betflip Gamble + + + Better luck next time ^_^ + + + Congratulations! You won {0} for rolling above {1} + + + Deck reshuffled. + + + flipped {0}. + User flipped tails. + + + You guessed it! You won {0} + + + Invalid number specified. You can flip 1 to {0} coins. + + + Add {0} reaction to this message to get {1} + + + This event is active for up to {0} hours. + + + Flower reaction event started! + + + has gifted {0} to {1} + X has gifted 15 flowers to Y + + + {0} has {1} + X has Y flowers + + + Heads + + + Leaderboard + + + Awarded {0} to {1} users from {2} role. + + + You can't bet more than {0} + + + You can't bet less than {0} + + + You don't have enough {0} + + + No more cards in the deck. + + + Raffled User + + + You rolled {0}. + + + Bet + + + WOAAHHHHHH!!! Congratulations!!! x{0} + + + A single {0}, x{1} + + + Wow! Lucky! Three of a kind! x{0} + + + Good job! Two {0} - bet x{1} + + + Won + + + Users must type a secret code to get {0}. +Lasts {1} seconds. Don't tell anyone. Shhh. + + + SneakyGame event ended. {0} users received the reward. + + + SneakyGameStatus event started + + + Tails + + + successfully took {0} from {1} + + + was unable to take {0} from{1} because the user doesn't have that much {2}! + \ No newline at end of file