Compare commits

...

17 Commits
6.1.6 ... v6

Author SHA1 Message Date
Wizkiller96 0e309f30d3 fix: Adjusted emoji for fishing. 2025-05-10 04:38:33 -04:00
Wizkiller96 f8916c0839 fix: minor change 2025-05-10 04:33:18 -04:00
Wizkiller96 d6395181d3 docs: minor change. 2025-05-04 13:49:32 -04:00
Wizkiller96 978837c84f docs: Adjusted some style elements. 2025-05-04 13:41:17 -04:00
Wizkiller96 61f53546ee docs: Fixed light theme? 2025-05-04 13:16:21 -04:00
Wizkiller96 fc8d8aca10 Adjust docs theme. 2025-05-04 12:58:11 -04:00
Wizkiller96 bbe644c68c fix: delete a scheduled command if it's too long 2025-04-29 23:36:22 -04:00
Wizkiller96 54325a25e0 docs: updated commandlist 2025-04-19 19:26:45 -04:00
Wizkiller96 5b250ba5f2 change: renamed nunchi to countup, added remaining user count to each guess 2025-04-19 19:24:29 -04:00
Wizkiller96 4711f9dffb fix: Fixed some permissions and re-enabled log command for everyone. 2025-04-19 15:03:07 -04:00
Wizkiller96 6ea0beb751 docs: upped version, updated changelog 2025-04-16 08:45:42 -04:00
Wizkiller96 3fb8209d2a fix: Fixed .ura hierarchy check
dev: fixed compilation warning
2025-04-16 08:43:51 -04:00
Wizkiller96 1978365102 add: Readded WizBot's custom commands and services. 2025-04-16 08:38:27 -04:00
Wizkiller96 56ae6ae72c fix: fixed .streamrole 2025-04-13 19:14:16 -04:00
Wizkiller96 22ce4b5546 fix: fix broken links 2025-04-13 19:11:19 -04:00
Wizkiller96 c344e28ee0 dev: Updated README.md 2025-04-13 00:48:27 -04:00
Wizkiller96 55ec00414e fix: fixed docker build. 2025-04-13 00:44:25 -04:00
69 changed files with 1455 additions and 491 deletions

View File

@ -135,7 +135,7 @@ jobs:
with: with:
push: true push: true
context: . context: .
tags: ghcr.io/Wizkiller96/WizBot:latest,ghcr.io/Wizkiller96/WizBot:v6,ghcr.io/Wizkiller96/WizBot:${{ github.ref_name }} tags: ghcr.io/wizkiller96/wizbot:latest,ghcr.io/wizkiller96/wizbot:v6,ghcr.io/wizkiller96/wizbot:${{ github.ref_name }}
publish-medusa-package: publish-medusa-package:
name: Publish Medusa Package name: Publish Medusa Package

View File

@ -2,8 +2,17 @@
*a,c,f,r,o* *a,c,f,r,o*
## [6.1.7] - 14.04.2025
### Fixed
- `.streamrole` fixed
- fixed `.ura` hierarchy check (it will let owners assign roles too)
## [6.1.6] - 12.04.2025 ## [6.1.6] - 12.04.2025
### Fixed
- QuestCommands no longer appear as a separate module - QuestCommands no longer appear as a separate module
## [6.1.5] - 06.04.2025 ## [6.1.5] - 06.04.2025

View File

@ -12,7 +12,7 @@ If you have any questions, please visit our [Discord support server](https://wiz
### Default option ### Default option
You may want to consider using [WizBot Updater](https://github.com/Wizkiller96/WizBot-Updater/releases) if you want to run bot on your PC.+ You may want to consider using [WizBot Updater](https://github.com/Wizkiller96/wizbot-updater/releases) if you want to run bot on your PC.+
### Hosting on a linux server ### Hosting on a linux server
@ -23,7 +23,7 @@ If you want your bot to be online 24/7, you should [host it on a linux vps](http
There is an official Docker image for a [simple setup](https://docs.wizbot.cc/guides/docker-guide/) There is an official Docker image for a [simple setup](https://docs.wizbot.cc/guides/docker-guide/)
Short version: Short version:
```sh ```sh
docker run -d --name wizbot ghcr.io/Wizkiller96/WizBot:v6 -e bot_token=YOUR_TOKEN_HERE -v "./data:/app/data" && docker logs -f --tail 500 wizbot docker run -d --name wizbot ghcr.io/wizkiller96/wizbot:v6 -e bot_token=YOUR_TOKEN_HERE -v "./data:/app/data" && docker logs -f --tail 500 wizbot
``` ```
## Contributing to WizBot ## Contributing to WizBot

View File

@ -13,7 +13,7 @@
## Setup ## Setup
1. Download and run the [WizBot Updater](https://github.com/Wizkiller96/WizBot/releases/latest). 1. Download and run the [WizBot Updater](https://github.com/Wizkiller96/wizbot-updater/releases/latest).
![Create a new bot](../assets/upeko-1.png "Create a new bot") ![Create a new bot](../assets/upeko-1.png "Create a new bot")

View File

@ -0,0 +1,122 @@
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700;1,900&display=swap');
/* general styling changes */
.md-typeset * {
letter-spacing: 0 !important;
}
.md-header__topic {
font-family: 'Noto Sans';
font-weight: 700 !important;
}
label[for="__toc"] {
text-transform: uppercase;
}
@media screen and (min-width: 76.25em) {
label[for="__drawer"] {
text-transform: uppercase;
}
}
.md-source__facts {
margin-top: 4px;
}
.md-source__fact {
display: inline-flex;
align-items: center;
}
@media screen and (max-width: 76.1875em) {
label[for="__drawer"] {
font-family: 'Noto Sans';
font-weight: 700 !important;
}
}
.md-typeset h1, h2, h3, h4, h5, h6 {
font-weight: 600 !important;
color: var(--md-default-fg-color);
width: 87%;
}
.md-header__title, .md-header__nav-title {
margin-left: 8px !important;
}
.md-search__form input {
padding-left: 44px;
font-size: 16px;
}
.md-search__form .md-search__icon {
display: flex;
place-items: center;
}
.md-search__form .md-search__icon svg {
height: 20px;
width: 20px;
}
.md-button {
border-radius: 4px !important;
}
.md-button:hover {
filter: brightness(110%);
}
.md-button:active {
transform: translateY(1px);
}
.md-button {
display: inline-flex !important;
place-items: center !important;
font-weight: 500 !important;
margin-right: 8px;
margin-bottom: 8px;
}
.md-button span {
height: auto !important;
}
.md-button span svg {
height: 24px;
width: 24px;
margin: 0px 8px;
}
.color--primary {
color: var(--md-primary-fg-color) !important;
}
.color--accent {
color: var(--md-accent-fg-color) !important;
}
.md-header {
box-shadow: none !important;
}
.md-main__inner {
margin-top: 0.5rem;
}
hr+h1, hr+h2, hr+h3, hr+h4, hr+h5, hr+h6 {
margin-top: 0px !important;
}
.md-sidebar {
top: 0px !important;
}
.admonition * {
font-size: .75rem;
}

View File

@ -0,0 +1,85 @@
[data-md-color-scheme="wizbot-dark"] {
/* Default color shades */
--md-primary-fg-color: #590074;
--md-primary-fg-color--light: #964aad;
--md-primary-fg-color--dark: #964aad;
--md-default-bg-color: #0b0b0b;
--md-default-bg-color--light: #e8e8e8;
--md-default-fg-color: hsla(0, 75%, 95%, 1);
--md-default-fg-color--light: hsla(0, 0%, 100%, 0.849);
--md-default-fg-color--lighter: hsla(0, 0%, 100%, 0.32);
--md-default-fg-color--lightest: hsla(0, 0%, 100%, 0.12);
--md-accent-fg-color: #964aad !important;
--md-typeset-color: var(--md-default-fg-color);
--md-typeset-a-color: #964aad !important;
--md-typeset-mark-color: #448aff;
--md-typeset-kbd-color: hsla(220, 10%, 94%, 0.12);
--md-typeset-kbd-accent-color: hsla(220, 10%, 94%, 0.2);
--md-typeset-kbd-border-color: hsla(220, 10%, 14%, 1);
--md-admonition-bg-color: hsla(220, 10%, 100%, 0.025);
--md-admonition-fg-color: hsla(0, 75%, 95%, 1);
/* Code Color Shade */
--md-code-fg-color: rgb(255, 255, 255);
--md-code-bg-color: rgb(39, 39, 39);
--md-code-hl-color: rgb(255, 255, 0);
--md-code-hl-number-color: rgb(235, 88, 88);
--md-code-hl-special-color: rgb(241, 104, 150);
--md-code-hl-function-color: rgb(168, 70, 185);
--md-code-hl-constant-color: rgb(110, 89, 217);
--md-code-hl-keyword-color: rgb(63, 110, 198);
--md-code-hl-string-color: rgb(64, 168, 116);
--md-code-hl-name-color: rgb(54, 70, 78);
--md-code-hl-operator-color: rgba(255, 255, 255, 0.54);
--md-code-hl-punctuation-color: rgba(255, 255, 255, 0.54);
--md-code-hl-comment-color: rgba(255, 255, 255, 0.54);
--md-code-hl-generic-color: rgba(255, 255, 255, 0.54);
--md-code-hl-variable-color: rgba(255, 255, 255, 0.54);
/* Footer color shades */
--md-footer-bg-color: rgb(43, 44, 46) !important;
--md-footer-bg-color--dark: rgb(25, 26, 27) !important;
}
[data-md-color-scheme="wizbot-light"] {
/* Default color shades */
--md-primary-fg-color: #590074;
--md-primary-fg-color--light: #964aad;
--md-primary-fg-color--dark: #964aad;
--md-default-bg-color: #e8e8e8;
--md-default-bg-color--light: #e8e8e8;
--md-default-fg-color: hsla(0, 0%, 0%, 1.5);
--md-default-fg-color--light: hsla(0deg, 0%, 0%, 85%);
--md-default-fg-color--lighter: hsla(0deg, 0%, 100%, 32%);
--md-default-fg-color--lightest: hsla(0deg, 0%, 100%, 12%);
--md-accent-fg-color: #964aad !important;
--md-typeset-color: var(--md-default-fg-color);
--md-typeset-a-color: #964aad !important;
--md-typeset-mark-color: #448aff;
--md-typeset-kbd-color: hsla(220, 10%, 94%, 0.12);
--md-typeset-kbd-accent-color: hsla(220, 10%, 94%, 0.2);
--md-typeset-kbd-border-color: hsla(220, 10%, 14%, 1);
--md-admonition-bg-color: hsla(220, 10%, 100%, 0.025);
--md-admonition-fg-color: rgba(0, 0, 0, 0.712);
/* Code Color Shade */
--md-code-fg-color: rgb(255, 255, 255);
--md-code-bg-color: rgb(39, 39, 39);
--md-code-hl-color: rgb(255, 255, 0);
--md-code-hl-number-color: rgb(235, 88, 88);
--md-code-hl-special-color: rgb(241, 104, 150);
--md-code-hl-function-color: rgb(168, 70, 185);
--md-code-hl-constant-color: rgb(110, 89, 217);
--md-code-hl-keyword-color: rgb(63, 110, 198);
--md-code-hl-string-color: rgb(64, 168, 116);
--md-code-hl-name-color: rgb(54, 70, 78);
--md-code-hl-operator-color: rgba(255, 255, 255, 0.54);
--md-code-hl-punctuation-color: rgba(255, 255, 255, 0.54);
--md-code-hl-comment-color: rgba(255, 255, 255, 0.54);
--md-code-hl-generic-color: rgba(255, 255, 255, 0.54);
--md-code-hl-variable-color: rgba(255, 255, 255, 0.54);
/* Footer color shades */
--md-footer-bg-color: rgb(43, 44, 46) !important;
--md-footer-bg-color--dark: rgb(25, 26, 27) !important;
}

View File

@ -10,16 +10,12 @@ theme:
name: material name: material
palette: palette:
- media: "(prefers-color-scheme: light)" - media: "(prefers-color-scheme: light)"
scheme: default scheme: wizbot-light
primary: deep purple
accent: deep purple
toggle: toggle:
icon: material/weather-sunny icon: material/weather-sunny
name: Switch to dark mode name: Switch to dark mode
- media: "(prefers-color-scheme: dark)" - media: "(prefers-color-scheme: dark)"
scheme: slate scheme: wizbot-dark
primary: deep purple
accent: deep purple
toggle: toggle:
icon: material/weather-night icon: material/weather-night
name: Switch to light mode name: Switch to light mode
@ -38,6 +34,14 @@ theme:
extra: extra:
homepage: https://wizbot.cc homepage: https://wizbot.cc
extra_javascript:
- https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js
extra_css:
- https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css
- stylesheets/styling-overrides.css
- stylesheets/theme.css
plugins: plugins:
- search - search
- exclude: - exclude:

View File

@ -42,11 +42,11 @@ public sealed class Bot : IBot
_db = new WizDbService(_credsProvider); _db = new WizDbService(_credsProvider);
var messageCacheSize = var messageCacheSize =
#if GLOBAL_WIZ //#if GLOBAL_WIZ
0; // 0;
#else //#else
50; 50;
#endif //#endif
if (!_creds.UsePrivilegedIntents) if (!_creds.UsePrivilegedIntents)
Log.Warning("You are not using privileged intents. Some features will not work properly"); Log.Warning("You are not using privileged intents. Some features will not work properly");

View File

@ -29,10 +29,10 @@ public static class GuildConfigExtensions
/// </summary> /// </summary>
/// <param name="ctx">Db Context</param> /// <param name="ctx">Db Context</param>
/// <param name="guildId">Id of the guild to get stream role settings for.</param> /// <param name="guildId">Id of the guild to get stream role settings for.</param>
/// <returns>Guild'p stream role settings</returns> /// <returns>Guild's stream role settings</returns>
public static async Task<StreamRoleSettings> GetOrCreateStreamRoleSettings(this DbContext ctx, ulong guildId) public static async Task<StreamRoleSettings> GetOrCreateStreamRoleSettings(this DbContext ctx, ulong guildId)
{ {
var srs = await ctx.GetTable<StreamRoleSettings>() var srs = await ctx.Set<StreamRoleSettings>()
.Where(x => x.GuildId == guildId) .Where(x => x.GuildId == guildId)
.FirstOrDefaultAsyncEF(); .FirstOrDefaultAsyncEF();

View File

@ -19,6 +19,8 @@ public sealed class SelfService : IExecNoCommand, IReadyExecutor, INService
private ImmutableDictionary<ulong, IDMChannel> ownerChannels = private ImmutableDictionary<ulong, IDMChannel> ownerChannels =
new Dictionary<ulong, IDMChannel>().ToImmutableDictionary(); new Dictionary<ulong, IDMChannel>().ToImmutableDictionary();
private ImmutableDictionary<ulong, IDMChannel> adminChannels =
new Dictionary<ulong, IDMChannel>().ToImmutableDictionary();
private ConcurrentDictionary<ulong?, ConcurrentDictionary<int, Timer>> autoCommands = new(); private ConcurrentDictionary<ulong?, ConcurrentDictionary<int, Timer>> autoCommands = new();
@ -202,6 +204,43 @@ public sealed class SelfService : IExecNoCommand, IReadyExecutor, INService
} }
} }
private async Task LoadAdminChannels()
{
var channels = await _creds.AdminIds.Select(async id =>
{
var user = _client.GetUser(id);
if (user is null)
return null;
try
{
return await user.CreateDMChannelAsync();
}
catch (Exception)
{
Log.Error("Unable to DM Bot Admin {UserId} - please remove that id from the admin list", user.Id);
return null;
}
})
.WhenAll();
adminChannels = channels.Where(x => x is not null)
.ToDictionary(x => x.Recipient.Id, x => x)
.ToImmutableDictionary();
if (!adminChannels.Any())
{
Log.Warning(
"No bot admin channels created! Make sure you've specified the correct AdminId in the creds.yml file and invited the bot to a Discord server");
}
else
{
Log.Information("Created {AdminChannelCount} out of {TotalAdminChannelCount} admin message channels",
adminChannels.Count,
_creds.AdminIds.Count);
}
}
public Task LeaveGuild(string guildStr) public Task LeaveGuild(string guildStr)
=> _pubSub.Pub(_guildLeaveKey, guildStr); => _pubSub.Pub(_guildLeaveKey, guildStr);

View File

@ -3,9 +3,9 @@
namespace WizBot.Modules.Administration; namespace WizBot.Modules.Administration;
public sealed class DummyLogCommandService : ILogCommandService public sealed class DummyLogCommandService : ILogCommandService
#if GLOBAL_WIZ /*#if GLOBAL_WIZ
, INService , INService
#endif #endif*/
{ {
public void AddDeleteIgnore(ulong xId) public void AddDeleteIgnore(ulong xId)
{ {

View File

@ -7,9 +7,9 @@ using WizBot.Db.Models;
namespace WizBot.Modules.Administration; namespace WizBot.Modules.Administration;
public sealed class LogCommandService : ILogCommandService, IReadyExecutor public sealed class LogCommandService : ILogCommandService, IReadyExecutor
#if !GLOBAL_WIZ //#if !GLOBAL_WIZ
, INService // don't load this service on global wiz , INService // don't load this service on global wiz
#endif //#endif
{ {
public ConcurrentDictionary<ulong, LogSetting> GuildLogSettings { get; } public ConcurrentDictionary<ulong, LogSetting> GuildLogSettings { get; }

View File

@ -6,13 +6,12 @@ namespace WizBot.Modules.Administration;
public partial class Administration public partial class Administration
{ {
[Group] [Group]
[NoPublicBot] // [NoPublicBot]
public partial class LogCommands : WizModule<ILogCommandService> public partial class LogCommands : WizModule<ILogCommandService>
{ {
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)] [UserPerm(GuildPerm.Administrator)]
[OwnerOnly]
public async Task LogServer(PermissionAction action) public async Task LogServer(PermissionAction action)
{ {
await _service.LogServer(ctx.Guild.Id, ctx.Channel.Id, action.Value); await _service.LogServer(ctx.Guild.Id, ctx.Channel.Id, action.Value);
@ -25,7 +24,6 @@ public partial class Administration
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)] [UserPerm(GuildPerm.Administrator)]
[OwnerOnly]
public async Task LogIgnore() public async Task LogIgnore()
{ {
var settings = _service.GetGuildLogSettings(ctx.Guild.Id); var settings = _service.GetGuildLogSettings(ctx.Guild.Id);
@ -52,7 +50,6 @@ public partial class Administration
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)] [UserPerm(GuildPerm.Administrator)]
[OwnerOnly]
public async Task LogIgnore([Leftover] ITextChannel target) public async Task LogIgnore([Leftover] ITextChannel target)
{ {
var removed = _service.LogIgnore(ctx.Guild.Id, target.Id, IgnoredItemType.Channel); var removed = _service.LogIgnore(ctx.Guild.Id, target.Id, IgnoredItemType.Channel);
@ -76,7 +73,6 @@ public partial class Administration
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)] [UserPerm(GuildPerm.Administrator)]
[OwnerOnly]
public async Task LogIgnore([Leftover] IUser target) public async Task LogIgnore([Leftover] IUser target)
{ {
var removed = _service.LogIgnore(ctx.Guild.Id, target.Id, IgnoredItemType.User); var removed = _service.LogIgnore(ctx.Guild.Id, target.Id, IgnoredItemType.User);
@ -98,7 +94,6 @@ public partial class Administration
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)] [UserPerm(GuildPerm.Administrator)]
[OwnerOnly]
public async Task LogEvents() public async Task LogEvents()
{ {
var logSetting = _service.GetGuildLogSettings(ctx.Guild.Id); var logSetting = _service.GetGuildLogSettings(ctx.Guild.Id);
@ -161,7 +156,6 @@ public partial class Administration
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.Administrator)] [UserPerm(GuildPerm.Administrator)]
[OwnerOnly]
public async Task Log(LogType type) public async Task Log(LogType type)
{ {
var val = _service.Log(ctx.Guild.Id, ctx.Channel.Id, type); var val = _service.Log(ctx.Guild.Id, ctx.Channel.Id, type);

View File

@ -120,19 +120,19 @@ public partial class Gambling
} }
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
[Priority(1)] [Priority(1)]
public async Task BankTake(long amount, [Leftover] IUser user) public async Task BankTake(long amount, [Leftover] IUser user)
=> await BankTakeInternalAsync(amount, user.Id); => await BankTakeInternalAsync(amount, user.Id);
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
[Priority(0)] [Priority(0)]
public async Task BankTake(long amount, ulong userId) public async Task BankTake(long amount, ulong userId)
=> await BankTakeInternalAsync(amount, userId); => await BankTakeInternalAsync(amount, userId);
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public async Task BankAward(long amount, [Leftover] IUser user) public async Task BankAward(long amount, [Leftover] IUser user)
=> await BankAwardInternalAsync(amount, user.Id); => await BankAwardInternalAsync(amount, user.Id);
} }

View File

@ -591,20 +591,20 @@ public partial class Gambling : GamblingModule<GamblingService>
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[OwnerOnly] [AdminOnly]
[Priority(0)] [Priority(0)]
public Task Award(long amount, IGuildUser usr, [Leftover] string msg) public Task Award(long amount, IGuildUser usr, [Leftover] string msg)
=> Award(amount, usr.Id, msg); => Award(amount, usr.Id, msg);
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[OwnerOnly] [AdminOnly]
[Priority(1)] [Priority(1)]
public Task Award(long amount, [Leftover] IGuildUser usr) public Task Award(long amount, [Leftover] IGuildUser usr)
=> Award(amount, usr.Id); => Award(amount, usr.Id);
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
[Priority(2)] [Priority(2)]
public async Task Award(long amount, ulong usrId, [Leftover] string msg = null) public async Task Award(long amount, ulong usrId, [Leftover] string msg = null)
{ {
@ -627,7 +627,7 @@ public partial class Gambling : GamblingModule<GamblingService>
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[OwnerOnly] [AdminOnly]
[Priority(3)] [Priority(3)]
public async Task Award(long amount, [Leftover] IRole role) public async Task Award(long amount, [Leftover] IRole role)
{ {
@ -646,7 +646,7 @@ public partial class Gambling : GamblingModule<GamblingService>
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[OwnerOnly] [AdminOnly]
[Priority(0)] [Priority(0)]
public async Task Take(long amount, [Leftover] IRole role) public async Task Take(long amount, [Leftover] IRole role)
{ {
@ -665,7 +665,7 @@ public partial class Gambling : GamblingModule<GamblingService>
[Cmd] [Cmd]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[OwnerOnly] [AdminOnly]
[Priority(1)] [Priority(1)]
public async Task Take(long amount, [Leftover] IGuildUser user) public async Task Take(long amount, [Leftover] IGuildUser user)
{ {
@ -689,7 +689,7 @@ public partial class Gambling : GamblingModule<GamblingService>
} }
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public async Task Take(long amount, [Leftover] ulong usrId) public async Task Take(long amount, [Leftover] ulong usrId)
{ {
if (amount <= 0) if (amount <= 0)

View File

@ -2,7 +2,6 @@
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using WizBot.Modules.Games.Common; using WizBot.Modules.Games.Common;
using WizBot.Modules.Games.Common.Acrophobia; using WizBot.Modules.Games.Common.Acrophobia;
using WizBot.Modules.Games.Common.Nunchi;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace WizBot.Modules.Games.Services; namespace WizBot.Modules.Games.Services;
@ -21,7 +20,7 @@ public class GamesService : INService
public ConcurrentDictionary<ulong, AcrophobiaGame> AcrophobiaGames { get; } = new(); public ConcurrentDictionary<ulong, AcrophobiaGame> AcrophobiaGames { get; } = new();
public Dictionary<ulong, TicTacToe> TicTacToeGames { get; } = new(); public Dictionary<ulong, TicTacToe> TicTacToeGames { get; } = new();
public ConcurrentDictionary<ulong, TypingGame> RunningContests { get; } = new(); public ConcurrentDictionary<ulong, TypingGame> RunningContests { get; } = new();
public ConcurrentDictionary<ulong, NunchiGame> NunchiGames { get; } = new(); public ConcurrentDictionary<ulong, CountUpGame> Games { get; } = new();
private readonly GamesConfigService _gamesConfig; private readonly GamesConfigService _gamesConfig;

View File

@ -0,0 +1,117 @@
#nullable disable
using WizBot.Modules.Games.Services;
namespace WizBot.Modules.Games;
public partial class Games
{
[Group]
public partial class CountUpCommands : WizModule<GamesService>
{
private readonly DiscordSocketClient _client;
public CountUpCommands(DiscordSocketClient client)
=> _client = client;
[Cmd]
[RequireContext(ContextType.Guild)]
public async Task CountUp()
{
var newGame = new CountUpGame(ctx.User.Id, ctx.User.ToString());
CountUpGame countUp;
//if a game was already active
if ((countUp = _service.Games.GetOrAdd(ctx.Guild.Id, newGame)) != newGame)
{
// join it
// if you failed joining, that means game is running or just ended
if (!await countUp.Join(ctx.User.Id, ctx.User.ToString()))
return;
await Response().Confirm(strs.countup_joined(countUp.ParticipantCount)).SendAsync();
return;
}
try { await Response().Confirm(strs.countup_created).SendAsync(); }
catch { }
countUp.OnGameEnded += CountUpOnGameEnded;
countUp.OnRoundEnded += CountUpOnRoundEnded;
countUp.OnUserGuessed += CountUpOnUserGuessed;
countUp.OnRoundStarted += CountUpOnRoundStarted;
_client.MessageReceived += ClientMessageReceived;
var success = await countUp.Initialize();
if (!success)
{
if (_service.Games.TryRemove(ctx.Guild.Id, out var game))
game.Dispose();
await Response().Confirm(strs.countup_failed_to_start).SendAsync();
}
Task ClientMessageReceived(SocketMessage arg)
{
_ = Task.Run(async () =>
{
if (arg.Channel.Id != ctx.Channel.Id)
return;
if (!int.TryParse(arg.Content, out var number))
return;
try
{
await countUp.Input(arg.Author.Id, arg.Author.ToString(), number);
}
catch
{
}
});
return Task.CompletedTask;
}
Task CountUpOnGameEnded(CountUpGame arg1, string arg2)
{
if (_service.Games.TryRemove(ctx.Guild.Id, out var game))
{
_client.MessageReceived -= ClientMessageReceived;
game.Dispose();
}
if (arg2 is null)
return Response().Confirm(strs.countup_ended_no_winner).SendAsync();
return Response().Confirm(strs.countup_ended(Format.Bold(arg2))).SendAsync();
}
}
private Task CountUpOnRoundStarted(CountUpGame arg, int cur)
=> Response()
.Confirm(strs.countup_round_started(Format.Bold(arg.ParticipantCount.ToString()),
Format.Bold(cur.ToString())))
.SendAsync();
private Task CountUpOnUserGuessed(CountUpGame arg)
=> Response()
.Embed(CreateEmbed()
.WithOkColor()
.WithDescription(GetText(strs.countup_next_number(Format.Bold(arg.CurrentNumber.ToString()))))
.WithFooter($"{arg.PassedCount} / {arg.ParticipantCount}"))
.SendAsync();
private Task CountUpOnRoundEnded(CountUpGame arg1, (ulong Id, string Name)? arg2)
{
if (arg2.HasValue)
return Response().Confirm(strs.countup_round_ended(Format.Bold(arg2.Value.Name))).SendAsync();
return Response()
.Confirm(strs.countup_round_ended_boot(
Format.Bold("\n"
+ string.Join("\n, ",
arg1.Participants.Select(x
=> x.Name)))))
.SendAsync(); // this won't work if there are too many users
}
private Task CountUpOnGameStarted(CountUpGame arg)
=> Response().Confirm(strs.countup_started(Format.Bold(arg.ParticipantCount.ToString()))).SendAsync();
}
}

View File

@ -1,9 +1,9 @@
#nullable disable #nullable disable
using System.Collections.Immutable; using System.Collections.Immutable;
namespace WizBot.Modules.Games.Common.Nunchi; namespace WizBot.Modules.Games;
public sealed class NunchiGame : IDisposable public sealed class CountUpGame : IDisposable
{ {
public enum Phase public enum Phase
{ {
@ -16,11 +16,11 @@ public sealed class NunchiGame : IDisposable
private const int KILL_TIMEOUT = 20 * 1000; private const int KILL_TIMEOUT = 20 * 1000;
private const int NEXT_ROUND_TIMEOUT = 5 * 1000; private const int NEXT_ROUND_TIMEOUT = 5 * 1000;
public event Func<NunchiGame, Task> OnGameStarted; public event Func<CountUpGame, Task> OnGameStarted;
public event Func<NunchiGame, int, Task> OnRoundStarted; public event Func<CountUpGame, int, Task> OnRoundStarted;
public event Func<NunchiGame, Task> OnUserGuessed; public event Func<CountUpGame, Task> OnUserGuessed;
public event Func<NunchiGame, (ulong Id, string Name)?, Task> OnRoundEnded; // tuple of the user who failed public event Func<CountUpGame, (ulong Id, string Name)?, Task> OnRoundEnded; // tuple of the user who failed
public event Func<NunchiGame, string, Task> OnGameEnded; // name of the user who won public event Func<CountUpGame, string, Task> OnGameEnded; // name of the user who won
public int CurrentNumber { get; private set; } = new WizRandom().Next(0, 100); public int CurrentNumber { get; private set; } = new WizRandom().Next(0, 100);
public Phase CurrentPhase { get; private set; } = Phase.Joining; public Phase CurrentPhase { get; private set; } = Phase.Joining;
@ -31,13 +31,16 @@ public sealed class NunchiGame : IDisposable
public int ParticipantCount public int ParticipantCount
=> participants.Count; => participants.Count;
public int PassedCount
=> _passed.Count;
private readonly SemaphoreSlim _locker = new(1, 1); private readonly SemaphoreSlim _locker = new(1, 1);
private HashSet<(ulong Id, string Name)> participants = []; private HashSet<(ulong Id, string Name)> participants = [];
private readonly HashSet<(ulong Id, string Name)> _passed = []; private readonly HashSet<(ulong Id, string Name)> _passed = [];
private Timer killTimer; private Timer killTimer;
public NunchiGame(ulong creatorId, string creatorName) public CountUpGame(ulong creatorId, string creatorName)
=> participants.Add((creatorId, creatorName)); => participants.Add((creatorId, creatorName));
public async Task<bool> Join(ulong userId, string userName) public async Task<bool> Join(ulong userId, string userName)

View File

@ -1,114 +0,0 @@
#nullable disable
using WizBot.Modules.Games.Common.Nunchi;
using WizBot.Modules.Games.Services;
namespace WizBot.Modules.Games;
public partial class Games
{
[Group]
public partial class NunchiCommands : WizModule<GamesService>
{
private readonly DiscordSocketClient _client;
public NunchiCommands(DiscordSocketClient client)
=> _client = client;
[Cmd]
[RequireContext(ContextType.Guild)]
public async Task Nunchi()
{
var newNunchi = new NunchiGame(ctx.User.Id, ctx.User.ToString());
NunchiGame nunchi;
//if a game was already active
if ((nunchi = _service.NunchiGames.GetOrAdd(ctx.Guild.Id, newNunchi)) != newNunchi)
{
// join it
// if you failed joining, that means game is running or just ended
if (!await nunchi.Join(ctx.User.Id, ctx.User.ToString()))
return;
await Response().Confirm(strs.nunchi_joined(nunchi.ParticipantCount)).SendAsync();
return;
}
try { await Response().Confirm(strs.nunchi_created).SendAsync(); }
catch { }
nunchi.OnGameEnded += NunchiOnGameEnded;
//nunchi.OnGameStarted += Nunchi_OnGameStarted;
nunchi.OnRoundEnded += Nunchi_OnRoundEnded;
nunchi.OnUserGuessed += Nunchi_OnUserGuessed;
nunchi.OnRoundStarted += Nunchi_OnRoundStarted;
_client.MessageReceived += ClientMessageReceived;
var success = await nunchi.Initialize();
if (!success)
{
if (_service.NunchiGames.TryRemove(ctx.Guild.Id, out var game))
game.Dispose();
await Response().Confirm(strs.nunchi_failed_to_start).SendAsync();
}
Task ClientMessageReceived(SocketMessage arg)
{
_ = Task.Run(async () =>
{
if (arg.Channel.Id != ctx.Channel.Id)
return;
if (!int.TryParse(arg.Content, out var number))
return;
try
{
await nunchi.Input(arg.Author.Id, arg.Author.ToString(), number);
}
catch
{
}
});
return Task.CompletedTask;
}
Task NunchiOnGameEnded(NunchiGame arg1, string arg2)
{
if (_service.NunchiGames.TryRemove(ctx.Guild.Id, out var game))
{
_client.MessageReceived -= ClientMessageReceived;
game.Dispose();
}
if (arg2 is null)
return Response().Confirm(strs.nunchi_ended_no_winner).SendAsync();
return Response().Confirm(strs.nunchi_ended(Format.Bold(arg2))).SendAsync();
}
}
private Task Nunchi_OnRoundStarted(NunchiGame arg, int cur)
=> Response()
.Confirm(strs.nunchi_round_started(Format.Bold(arg.ParticipantCount.ToString()),
Format.Bold(cur.ToString())))
.SendAsync();
private Task Nunchi_OnUserGuessed(NunchiGame arg)
=> Response().Confirm(strs.nunchi_next_number(Format.Bold(arg.CurrentNumber.ToString()))).SendAsync();
private Task Nunchi_OnRoundEnded(NunchiGame arg1, (ulong Id, string Name)? arg2)
{
if (arg2.HasValue)
return Response().Confirm(strs.nunchi_round_ended(Format.Bold(arg2.Value.Name))).SendAsync();
return Response()
.Confirm(strs.nunchi_round_ended_boot(
Format.Bold("\n"
+ string.Join("\n, ",
arg1.Participants.Select(x
=> x.Name)))))
.SendAsync(); // this won't work if there are too many users
}
private Task Nunchi_OnGameStarted(NunchiGame arg)
=> Response().Confirm(strs.nunchi_started(Format.Bold(arg.ParticipantCount.ToString()))).SendAsync();
}
}

View File

@ -182,6 +182,8 @@ public sealed partial class Help : WizModule<HelpService>
return strs.module_description_xp; return strs.module_description_xp;
case "medusa": case "medusa":
return strs.module_description_medusa; return strs.module_description_medusa;
case "roblox":
return strs.module_description_roblox;
case "patronage": case "patronage":
return strs.module_description_patronage; return strs.module_description_patronage;
default: default:
@ -214,6 +216,8 @@ public sealed partial class Help : WizModule<HelpService>
return "🚓"; return "🚓";
case "xp": case "xp":
return "📝"; return "📝";
case "roblox":
return "🟥";
case "patronage": case "patronage":
return "💝"; return "💝";
default: default:
@ -493,6 +497,122 @@ public sealed partial class Help : WizModule<HelpService>
await ctx.Channel.SendFileAsync(rDataStream, "cmds.json", GetText(strs.commandlist_regen)); await ctx.Channel.SendFileAsync(rDataStream, "cmds.json", GetText(strs.commandlist_regen));
} }
[Cmd]
[OnlyPublicBot]
public async Task Feedback(string type, [Remainder] string message)
{
if (string.IsNullOrWhiteSpace(type) || string.IsNullOrWhiteSpace(message))
return;
type = type.Equals("Bug", StringComparison.OrdinalIgnoreCase) ? "Bug" :
type.Equals("Suggestion", StringComparison.OrdinalIgnoreCase) ? "Suggestion" : null;
if (type == null)
{
await Response()
.Embed(CreateEmbed()
.WithErrorColor()
.WithTitle("Error: Report not sent.")
.WithDescription("Please make sure you used the correct report types listed below.")
.AddField("Report Types:", "`Bug`, `Suggestion`"))
.SendAsync();
return;
}
var embed = CreateEmbed()
.WithOkColor()
.WithTitle(type == "Bug" ? "New Bug Report" : "New Suggestion")
.WithThumbnailUrl(ctx.User.GetAvatarUrl())
.AddField(type == "Bug" ? "Reporter" : "Suggester", ctx.User.ToString(), true)
.AddField(type == "Bug" ? "Reporter ID" : "Suggester ID", ctx.User.Id.ToString(), true)
.AddField("Server Name", ctx.Guild.Name, true)
.AddField("Server ID", ctx.Guild.Id.ToString(), true)
.AddField("Channel Name", ctx.Channel.Name, true)
.AddField("Channel ID", ctx.Channel.Id.ToString(), true)
.AddField("Type", type, false)
.AddField(type == "Bug" ? "Message" : "Suggestion", message);
var channelId = type == "Bug" ? 1012808771371794433 : 1245658384452288573;
var channel = _client.GetGuild(99273784988557312).GetTextChannel((ulong)channelId);
var fbmsg = await channel.SendMessageAsync(embed: embed.Build());
if (type == "Suggestion")
{
await fbmsg.AddReactionAsync(Emote.Parse("<:down_vote:1012571380144951346>"));
await fbmsg.AddReactionAsync(Emote.Parse("<:vote_up:1012571381126418432>"));
}
await Response()
.Text($"{type} has been sent to WizNet's Discord.")
.SendAsync();
}
[Cmd]
[OnlyPublicBot]
public async Task Report(IGuildUser ruser, [Remainder] string rexplaination)
{
var user = ruser ?? ctx.User as IGuildUser;
if (user == null && string.IsNullOrEmpty(rexplaination))
{
await Response()
.Embed(CreateEmbed()
.WithErrorColor()
.WithTitle("Error: Abuse report not sent.")
.WithDescription("Please make sure you filled out all the fields correctly."))
.SendAsync();
return;
}
if (user == null)
{
await Response()
.Embed(CreateEmbed()
.WithErrorColor()
.WithTitle("Error: Abuse report not sent.")
.WithDescription("Please make sure you provided the username of the person you are reporting."))
.SendAsync();
return;
}
if (string.IsNullOrEmpty(rexplaination))
{
await Response()
.Embed(CreateEmbed()
.WithErrorColor()
.WithTitle("Error: Abuse report not sent.")
.WithDescription("Please make sure you provided an explanation in your report."))
.SendAsync();
return;
}
var reportEmbed = CreateEmbed()
.WithOkColor()
.WithTitle("Abuse Report")
.WithThumbnailUrl(ctx.User.GetAvatarUrl())
.AddField("Reporter:", ctx.User.ToString(), true)
.AddField("Reporter ID:", ctx.User.Id.ToString(), true)
.AddField("Server Name:", ctx.Guild.Name, true)
.AddField("Server ID:", ctx.Guild.Id.ToString(), true)
.AddField("Channel Name:", ctx.Channel.Name, true)
.AddField("Channel ID:", ctx.Channel.Id.ToString(), true)
.AddField("Reported User:", $"**{user.Username}**#{user.Discriminator} | {user.Id}", false)
.AddField("Explanation/Proof:", rexplaination);
var reportChannel = _client.GetGuild(99273784988557312).GetTextChannel(590829242690961408);
await reportChannel.SendMessageAsync("<@&367646195889471499>");
await Response()
.Channel(reportChannel)
.Embed(reportEmbed)
.SendAsync();
await Response()
.Text("Report sent to WizBot's Staff.")
.SendAsync();
}
[Cmd] [Cmd]
public async Task Guide() public async Task Guide()
=> await Response() => await Response()

View File

@ -74,7 +74,7 @@ public partial class Permissions
} }
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public Task UserBlacklist(int page = 1) public Task UserBlacklist(int page = 1)
{ {
if (--page < 0) if (--page < 0)
@ -84,7 +84,7 @@ public partial class Permissions
} }
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public Task ChannelBlacklist(int page = 1) public Task ChannelBlacklist(int page = 1)
{ {
if (--page < 0) if (--page < 0)
@ -94,7 +94,7 @@ public partial class Permissions
} }
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public Task ServerBlacklist(int page = 1) public Task ServerBlacklist(int page = 1)
{ {
if (--page < 0) if (--page < 0)
@ -104,27 +104,27 @@ public partial class Permissions
} }
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public Task UserBlacklist(AddRemove action, ulong id) public Task UserBlacklist(AddRemove action, ulong id)
=> Blacklist(action, id, BlacklistType.User); => Blacklist(action, id, BlacklistType.User);
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public Task UserBlacklist(AddRemove action, IUser usr) public Task UserBlacklist(AddRemove action, IUser usr)
=> Blacklist(action, usr.Id, BlacklistType.User); => Blacklist(action, usr.Id, BlacklistType.User);
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public Task ChannelBlacklist(AddRemove action, ulong id) public Task ChannelBlacklist(AddRemove action, ulong id)
=> Blacklist(action, id, BlacklistType.Channel); => Blacklist(action, id, BlacklistType.Channel);
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public Task ServerBlacklist(AddRemove action, ulong id) public Task ServerBlacklist(AddRemove action, ulong id)
=> Blacklist(action, id, BlacklistType.Server); => Blacklist(action, id, BlacklistType.Server);
[Cmd] [Cmd]
[OwnerOnly] [AdminOnly]
public Task ServerBlacklist(AddRemove action, IGuild guild) public Task ServerBlacklist(AddRemove action, IGuild guild)
=> Blacklist(action, guild.Id, BlacklistType.Server); => Blacklist(action, guild.Id, BlacklistType.Server);

View File

@ -0,0 +1,140 @@
using Newtonsoft.Json.Linq;
using WizBot.Modules.Searches.Services;
namespace WizBot.Modules.Roblox;
// Basic Roblox command using Roblox API.
// Official Roblox API can be found at: http://api.roblox.com/docs
// More Roblox API info at: https://api.roblox.com/docs?useConsolidatedPage=true
public partial class Roblox : WizModule<SearchesService>
{
private readonly IHttpClientFactory _httpFactory;
public Roblox(IHttpClientFactory factory)
{
_httpFactory = factory;
}
// Code is a bit messy as this was a temp solution to fix the nulled issue.
// This code can be redone and clean up if anyone willing to do it.
[Cmd]
[Ratelimit(10)]
public async Task RbxInfo([Remainder] string username)
{
if (string.IsNullOrWhiteSpace(username))
return;
try
{
// Make a checker to see if a Roblox account exist before showing info.
JToken rbxInfo;
//JToken rDevForum;
//JToken rMT;
using (var http = _httpFactory.CreateClient())
{
rbxInfo = JObject.Parse(await http
.GetStringAsync($"https://wizbot.cc/api/v1/roblox/getPlayerInfo/{username}")
.ConfigureAwait(false));
/*rDevForum = JObject.Parse(await http
.GetStringAsync(
$"https://devforum.roblox.com/u/by-external/{rbxInfo["userId"]}.json")
.ConfigureAwait(false));*/
// Roblox Membership Type Checker
// rMT = JObject.Parse(await http.GetStringAsync($"https://groups.roblox.com/v1/users/{rbxInfo["userId"]}/group-membership-status").ConfigureAwait(false));
}
var none = "N/A";
// Roblox Membership Type Checker
/* if ((int)rMT["membershipType"] == 4)
{
rMT["membershipType"] = "Premium";
}
else
{
rMT["membershipType"] = "None";
} */
// DevForum Trust Level
/*if ((int)rDevForum["user"]!["trust_level"]! == 1)
{
rDevForum["user"]!["trust_level"] = "Member";
}
else if ((int)rDevForum["user"]!["trust_level"]! == 2)
{
rDevForum["user"]!["trust_level"] = "Regular";
}
else if ((int)rDevForum["user"]!["trust_level"]! == 3)
{
rDevForum["user"]!["trust_level"] = "Community Editor";
}
else if ((int)rDevForum["user"]!["trust_level"]! == 4)
{
rDevForum["user"]!["trust_level"] = "Roblox Staff";
}
else
{
rDevForum["user"]!["trust_level"] = "Visitor";
}*/
var pastNames = string.Join("\n", rbxInfo["oldNames"]!.Take(5));
if (string.IsNullOrEmpty(pastNames))
{
pastNames = "N/A";
}
await Response().Embed(_sender.CreateEmbed()
.WithOkColor()
.WithAuthor($"{rbxInfo["username"]}'s Roblox Info",
"https://i.imgur.com/jDcWXPD.png",
"https://roblox.com")
.WithThumbnailUrl($"{rbxInfo["avatarBust"]}")
.AddField("Username",
$"[{rbxInfo["username"]}](https://www.roblox.com/users/{rbxInfo["userId"]}/profile)",
true)
.AddField("Display Name", $"{rbxInfo["displayName"]}", true)
.AddField("User ID", $"{rbxInfo["userId"]}", true)
.AddField("Verified Badge", $"{rbxInfo["verifiedBadge"]}", true)
.AddField("Friends", $"{rbxInfo["friendCount"]}", true)
.AddField("Followers", $"{rbxInfo["followerCount"]}", true)
.AddField("Following", $"{rbxInfo["followingCount"]}", true)
// .AddField("Membership", $"{rMT["membershipType"]}", true)
.AddField("Account Age",
string.IsNullOrEmpty($"{rbxInfo["age"]}") ? none : ($"{rbxInfo["age"]}"),
true)
.AddField("Join Date",
string.IsNullOrEmpty($"{rbxInfo["joinDate"]}")
? none
: ($"{rbxInfo["joinDate"]:MM.dd.yyyy HH:mm}"), true)
.AddField("Blurb",
(string.IsNullOrEmpty($"{rbxInfo["blurb"]}")
? none
: ($"{rbxInfo["blurb"]}".TrimTo(170)))!)
.AddField($"Past Names (" + rbxInfo["oldNames"]!.Count() + ")", pastNames))
.SendAsync();
// Add a check incase user doesn't have a devforum account.
/*await Response().Embed(_sender.CreateEmbed()
.WithOkColor()
.WithAuthor($"{rbxInfo["username"]}'s DevForum Info",
"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/3X/a/7/a7c93ee978f5f5326adb01270f17c287771fbe81.png",
"https://devforum.roblox.com")
.AddField("Username",
$"[{rbxInfo["username"]}](https://devforum.roblox.com/u/{rDevForum["user"]!["username"]})",
true)
.AddField("Title",
string.IsNullOrEmpty($"{rDevForum["user"]!["title"]}")
? none
: ($"{rDevForum["user"]!["title"]}"), true)
.AddField("Trust Level", $"{rDevForum["user"]!["trust_level"]}", true)
.AddField("Bio", (string.IsNullOrEmpty($"{rDevForum["user"]!["bio_raw"]}")
? none
: ($"{rDevForum["user"]!["bio_raw"]}".TrimTo(170)))!))
.SendAsync();*/
}
catch (Exception ex)
{
await Response().Error(ex.Message).SendAsync(true);
}
}
}

View File

@ -2,6 +2,7 @@ using Microsoft.Extensions.Caching.Memory;
using WizBot.Modules.Searches.Common; using WizBot.Modules.Searches.Common;
using WizBot.Modules.Searches.Services; using WizBot.Modules.Searches.Services;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SixLabors.ImageSharp; using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing.Processing; using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.PixelFormats;
@ -460,6 +461,90 @@ public partial class Searches : WizModule<SearchesService>
await Response().Text(response).Sanitize().SendAsync(); await Response().Text(response).Sanitize().SendAsync();
} }
[Cmd]
public async Task Nya([Remainder] string category = "neko")
{
// List if category to pull an image from.
string[] cat =
{
"smug", "woof", "goose", "cuddle", "slap", "pat",
"gecg", "feed", "fox_girl", "lizard", "neko", "hug", "meow", "kiss", "tickle", "waifu", "ngif"
};
if (string.IsNullOrWhiteSpace(category))
return;
try
{
JToken nekotitle;
JToken nekoimg;
using (var http = _httpFactory.CreateClient())
{
nekotitle = JObject.Parse(await http.GetStringAsync($"https://nekos.life/api/v2/cat")
.ConfigureAwait(false));
nekoimg = JObject.Parse(await http
.GetStringAsync(
$"https://nekos.life/api/v2/img/{category}")
.ConfigureAwait(false));
}
if (cat.Contains(category))
await Response()
.Embed(CreateEmbed()
.WithOkColor()
.WithAuthor(
$"Nekos Life - Image Database {nekotitle["cat"]}",
"https://i.imgur.com/a36AMkG.png",
"http://nekos.life/")
.WithImageUrl($"{nekoimg["url"]}"))
.SendAsync();
else
await Response()
.Embed(CreateEmbed()
.WithErrorColor()
.WithAuthor("Nekos Life - Invalid Category",
"https://i.imgur.com/a36AMkG.png",
"http://nekos.life/")
.WithDescription(
"Seems the category you was looking for could not be found. Please use the categories listed below.")
.AddField("Categories",
"`smug`, `woof`, `goose`, `cuddle`, `slap`, `pat`, `gecg`, `feed`, `fox_girl`, `lizard`, `neko`, `hug`, `meow`, `kiss`, `tickle`, `waifu`, `ngif`",
false))
.SendAsync();
}
catch (Exception ex)
{
await Response().Error(ex.Message).SendAsync();
}
}
// Waifu Gen Command
[Cmd]
public async Task GWaifu()
{
try
{
using (var http = _httpFactory.CreateClient())
{
//var waifutxt = await http.GetStringAsync($"https://www.thiswaifudoesnotexist.net/snippet-{new WizBotRandom().Next(0, 100000)}.txt").ConfigureAwait(false);
await Response()
.Embed(CreateEmbed()
.WithOkColor()
.WithAuthor("This Waifu Does Not Exist",
null,
"https://www.thiswaifudoesnotexist.net")
.WithImageUrl(
$"https://www.thiswaifudoesnotexist.net/example-{new WizRandom().Next(0, 100000)}.jpg"))
//.WithDescription($"{waifutxt}".TrimTo(1000)))
.SendAsync();
}
}
catch (Exception ex)
{
await Response().Error(ex.Message).SendAsync();
}
}
[Cmd] [Cmd]
public async Task Steam([Leftover] string query) public async Task Steam([Leftover] string query)
{ {

View File

@ -21,11 +21,16 @@ public sealed class ScheduleCommandService(
_tcs = new(); _tcs = new();
// get the next scheduled command // get the next scheduled command
var scheduledCommand = await db.GetDbContext() ScheduledCommand? scheduledCommand;
.GetTable<ScheduledCommand>()
.Where(x => Queries.GuildOnShard(x.GuildId, shardData.TotalShards, shardData.ShardId)) await using (var ctx = db.GetDbContext())
.OrderBy(x => x.When) {
.FirstOrDefaultAsyncLinqToDB(); scheduledCommand = await ctx
.GetTable<ScheduledCommand>()
.Where(x => Queries.GuildOnShard(x.GuildId, shardData.TotalShards, shardData.ShardId))
.OrderBy(x => x.When)
.FirstOrDefaultAsyncLinqToDB();
}
if (scheduledCommand is null) if (scheduledCommand is null)
{ {
@ -36,8 +41,20 @@ public sealed class ScheduleCommandService(
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
if (scheduledCommand.When > now) if (scheduledCommand.When > now)
{ {
var diff = scheduledCommand.When - now; try
await Task.WhenAny(Task.Delay(diff), _tcs.Task); {
var diff = scheduledCommand.When - now;
await Task.WhenAny(Task.Delay(diff), _tcs.Task);
}
catch (Exception e)
{
Log.Error(e, "Error in ScheduleCommandService");
await using var ctx = db.GetDbContext();
await ctx.GetTable<ScheduledCommand>()
.Where(x => x.Id == scheduledCommand.Id)
.DeleteAsync();
}
continue; continue;
} }

View File

@ -20,17 +20,7 @@ public partial class Utility
[UserPerm(GuildPerm.ManageRoles)] [UserPerm(GuildPerm.ManageRoles)]
public async Task UserRoleAssign(IGuildUser user, IRole role) public async Task UserRoleAssign(IGuildUser user, IRole role)
{ {
var modUser = (IGuildUser)ctx.User; if (!await CheckRoleHierarchy(role))
if (modUser.GetRoles().Max(x => x.Position) <= role.Position)
{
await Response().Error(strs.userrole_hierarchy_error).SendAsync();
return;
}
var botUser = ((SocketGuild)ctx.Guild).CurrentUser;
if (botUser.GetRoles().Max(x => x.Position) <= role.Position)
{ {
await Response().Error(strs.hierarchy).SendAsync(); await Response().Error(strs.hierarchy).SendAsync();
return; return;

View File

@ -333,11 +333,16 @@ public partial class Utility : WizModule
if (string.IsNullOrWhiteSpace(ownerIds)) if (string.IsNullOrWhiteSpace(ownerIds))
ownerIds = "-"; ownerIds = "-";
var adminIds = string.Join("\n", _creds.AdminIds);
if (string.IsNullOrWhiteSpace(adminIds))
adminIds = "-";
var eb = CreateEmbed() var eb = CreateEmbed()
.WithOkColor() .WithOkColor()
.WithAuthor($"WizBot v{StatsService.BotVersion}", .WithAuthor($"WizBot v{StatsService.BotVersion}",
"https://cdn.wizbot.cc/other/bot/wizbot_icon.png", "https://cdn.wizbot.cc/other/bot/wizbot_icon.png",
"https://wizbot.cc") "https://wizbot.cc")
.WithImageUrl("https://cdn.wizbot.cc/other/bot/wizbot-banner.jpg")
.AddField(GetText(strs.author), _stats.Author, true) .AddField(GetText(strs.author), _stats.Author, true)
.AddField(GetText(strs.botid), _client.CurrentUser.Id.ToString(), true) .AddField(GetText(strs.botid), _client.CurrentUser.Id.ToString(), true)
.AddField(GetText(strs.shard), .AddField(GetText(strs.shard),
@ -351,6 +356,7 @@ public partial class Utility : WizModule
FormattableString.Invariant($"{_stats.GetPrivateMemoryMegabytes():F2} MB"), FormattableString.Invariant($"{_stats.GetPrivateMemoryMegabytes():F2} MB"),
true) true)
.AddField(GetText(strs.owner_ids), ownerIds, true) .AddField(GetText(strs.owner_ids), ownerIds, true)
.AddField(GetText(strs.admin_ids), adminIds, true)
.AddField(GetText(strs.uptime), _stats.GetUptimeString("\n"), true) .AddField(GetText(strs.uptime), _stats.GetUptimeString("\n"), true)
.AddField(GetText(strs.presence), .AddField(GetText(strs.presence),
GetText(strs.presence_txt(_coord.GetGuildCount(), GetText(strs.presence_txt(_coord.GetGuildCount(),
@ -819,4 +825,69 @@ public partial class Utility : WizModule
ctx.Message.DeleteAfter(1); ctx.Message.DeleteAfter(1);
await Response().Embed(eb).SendAsync(); await Response().Embed(eb).SendAsync();
} }
[Cmd]
[OnlyPublicBot]
public async Task Donators()
{
const int maxDisplayCount = 20; // Maximum number of users to display
// Make it so it won't error when no users are found.
var dusers = _client.GetGuild(99273784988557312).GetRole(280182841114099722).Members.ToList();
var pusers = _client.GetGuild(99273784988557312).GetRole(299174013597646868).Members.ToList();
string FormatUserList(IEnumerable<IGuildUser> users)
{
var userList = users.Take(maxDisplayCount).Select(u => u.ToString()).ToList();
if (users.Count() > maxDisplayCount)
userList.Add($"and {users.Count() - maxDisplayCount} more");
return string.Join("\n", userList);
}
await Response()
.Embed(CreateEmbed()
.WithOkColor()
.WithTitle($"WizBot - Donators")
.WithDescription("List of users who have donated to WizBot.")
.AddField("Donators:", FormatUserList(dusers), false))
.SendAsync();
await Response()
.Embed(CreateEmbed()
.WithOkColor()
.WithTitle($"WizBot - Patreon Donators")
.WithDescription("List of users who have donated through WizNet's Patreon.")
.AddField("Patreon Donators:", FormatUserList(pusers), false))
.SendAsync();
}
[Cmd]
[OnlyPublicBot]
public async Task WizNet()
{
const int maxDisplayCount = 10; // Maximum number of users to display
// Make it so it won't error when no users are found.
var wnstaff = _client.GetGuild(99273784988557312).GetRole(348560594045108245).Members.ToList(); // WizNet Staff
var wbstaff = _client.GetGuild(99273784988557312).GetRole(367646195889471499).Members.ToList(); // WizBot Staff
string FormatUserList(IEnumerable<IGuildUser> users)
{
var userList = users.Take(maxDisplayCount).Select(u => u.ToString()).ToList();
if (users.Count() > maxDisplayCount)
userList.Add($"and {users.Count() - maxDisplayCount} more");
return string.Join("\n", userList);
}
await Response()
.Embed(CreateEmbed()
.WithOkColor()
.WithTitle("WizNet's Info")
.WithThumbnailUrl("https://i.imgur.com/Go5ZymW.png")
.WithDescription("WizNet is a small internet company that was made by Wizkiller96. The site first started off more as a social platform for his friends to have a place to hangout and chat with each other and share their work. Since then the site has gone through many changes and reforms. It now sits as a small hub for all the services and work WizNet provides to the public.")
.AddField("Websites", "[WizNet](http://wiznet.work/)\n[Wiz VPS](http://wiz-vps.com/)\n[WizBot](http://wizbot.cc)", true)
.AddField("Social Media", "[Facebook](http://facebook.com/Wizkiller96Network)\n[WizBot's Twitter](http://twitter.com/WizBot_Dev)", true)
.AddField("WizNet Staff", FormatUserList(wnstaff), false)
.AddField("WizBot Staff", FormatUserList(wbstaff), false)
.WithFooter("Note: Not all staff are listed here."))
.SendAsync();
}
} }

View File

@ -6,5 +6,6 @@ public enum BuyResult
XpShopDisabled, XpShopDisabled,
AlreadyOwned, AlreadyOwned,
InsufficientFunds, InsufficientFunds,
InsufficientPatronTier,
UnknownItem, UnknownItem,
} }

View File

@ -319,6 +319,12 @@ public partial class Xp : WizModule<XpService>
if (!string.IsNullOrWhiteSpace(item.Desc)) if (!string.IsNullOrWhiteSpace(item.Desc))
eb.AddField(GetText(strs.desc), item.Desc); eb.AddField(GetText(strs.desc), item.Desc);
if (!string.IsNullOrWhiteSpace(item.Author))
eb.AddField(GetText(strs.author), item.Author);
if (item.TierRequirement != PatronTier.None)
eb.AddField(GetText(strs.xpshop_required_tier), "Patron Tier " + item.TierRequirement, true);
return eb; return eb;
}) })
.Interaction(async current => .Interaction(async current =>
@ -393,6 +399,7 @@ public partial class Xp : WizModule<XpService>
BuyResult.AlreadyOwned => BuyResult.AlreadyOwned =>
await Response().Error(strs.xpshop_already_owned).Interaction(GetUseInteraction()).SendAsync(), await Response().Error(strs.xpshop_already_owned).Interaction(GetUseInteraction()).SendAsync(),
BuyResult.UnknownItem => await Response().Error(strs.xpshop_item_not_found).SendAsync(), BuyResult.UnknownItem => await Response().Error(strs.xpshop_item_not_found).SendAsync(),
BuyResult.InsufficientPatronTier => await Response().Error(strs.patron_insuff_tier).SendAsync(),
_ => throw new ArgumentOutOfRangeException() _ => throw new ArgumentOutOfRangeException()
}; };
return; return;

View File

@ -36,6 +36,18 @@ public sealed partial class XpConfig : ICloneable<XpConfig>
""")] """)]
public bool IsEnabled { get; set; } = false; public bool IsEnabled { get; set; } = false;
[Comment("""
Which patron tier do users need in order to use the .xpshop bgs command
Leave at 'None' if patron system is disabled or you don't want any restrictions
""")]
public PatronTier BgsTierRequirement { get; set; } = PatronTier.None;
[Comment("""
Which patron tier do users need in order to use the .xpshop frames command
Leave at 'None' if patron system is disabled or you don't want any restrictions
""")]
public PatronTier FramesTierRequirement { get; set; } = PatronTier.None;
[Comment(""" [Comment("""
Frames available for sale. Keys are unique IDs. Frames available for sale. Keys are unique IDs.
Do not change keys as they are not publicly visible. Only change properties (name, price, id) Do not change keys as they are not publicly visible. Only change properties (name, price, id)
@ -68,6 +80,9 @@ public sealed partial class XpConfig : ICloneable<XpConfig>
"""Price of the item. Set to -1 if you no longer want to sell the item but want the users to be able to keep their old purchase""")] """Price of the item. Set to -1 if you no longer want to sell the item but want the users to be able to keep their old purchase""")]
public int Price { get; set; } public int Price { get; set; }
[Comment("""Patron Tier requirement to purchase the item""")]
public PatronTier TierRequirement { get; set; } = PatronTier.None;
[Comment("""Direct url to the .png image which will be applied to the user's XP card""")] [Comment("""Direct url to the .png image which will be applied to the user's XP card""")]
public string Url { get; set; } public string Url { get; set; }
@ -76,6 +91,9 @@ public sealed partial class XpConfig : ICloneable<XpConfig>
[Comment("""Optional description of the item""")] [Comment("""Optional description of the item""")]
public string Desc { get; set; } public string Desc { get; set; }
[Comment(@"Optional author of the item")]
public string Author { get; set; }
} }
} }

View File

@ -988,6 +988,34 @@ public class XpService : INService, IReadyExecutor, IExecNoCommand
if (item is null || item.Price < 0) if (item is null || item.Price < 0)
return BuyResult.UnknownItem; return BuyResult.UnknownItem;
if (type == XpShopItemType.Frame)
{
var frameItem = conf.Shop.Frames[key];
var frameReq = frameItem.TierRequirement;
if (frameReq != PatronTier.None && !_creds.IsOwner(userId))
{
var patron = await _ps.GetPatronAsync(userId);
if (patron is null || (int)patron.Value.Tier < (int)frameReq)
return BuyResult.InsufficientPatronTier;
}
}
if (type == XpShopItemType.Background)
{
var bgItem = conf.Shop.Bgs[key];
var bgReq = bgItem.TierRequirement;
if (bgReq != PatronTier.None && !_creds.IsOwner(userId))
{
var patron = await _ps.GetPatronAsync(userId);
if (patron is null || (int)patron.Value.Tier < (int)bgReq)
return BuyResult.InsufficientPatronTier;
}
}
if (item.Price > 0 && !await _cs.RemoveAsync(userId, item.Price, new("xpshop", "buy", $"Background {key}"))) if (item.Price > 0 && !await _cs.RemoveAsync(userId, item.Price, new("xpshop", "buy", $"Background {key}")))
return BuyResult.InsufficientFunds; return BuyResult.InsufficientFunds;

View File

@ -4,7 +4,7 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>true</ImplicitUsings> <ImplicitUsings>true</ImplicitUsings>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages> <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
<Version>6.1.6</Version> <Version>6.1.7</Version>
<!-- Output/build --> <!-- Output/build -->
<RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory> <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>

View File

@ -6,6 +6,7 @@ public interface IBotCreds
string Token { get; } string Token { get; }
string NadekoAiToken { get; } string NadekoAiToken { get; }
ICollection<ulong> OwnerIds { get; set; } ICollection<ulong> OwnerIds { get; set; }
ICollection<ulong> AdminIds { get; set; }
string GoogleApiKey { get; } string GoogleApiKey { get; }
bool UsePrivilegedIntents { get; } bool UsePrivilegedIntents { get; }
string RapidApiKey { get; } string RapidApiKey { get; }

View File

@ -0,0 +1,19 @@
using Microsoft.Extensions.DependencyInjection;
namespace WizBot.Common.Attributes;
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class AdminOnlyAttribute : PreconditionAttribute
{
public override Task<PreconditionResult> CheckPermissionsAsync(
ICommandContext context,
CommandInfo command,
IServiceProvider services)
{
var creds = services.GetRequiredService<IBotCredsProvider>().GetCreds();
return Task.FromResult(creds.IsOwner(context.User) || creds.IsAdmin(context.User) || context.Client.CurrentUser.Id == context.User.Id
? PreconditionResult.FromSuccess()
: PreconditionResult.FromError("Not bot staff"));
}
}

View File

@ -17,6 +17,12 @@ public sealed class Creds : IBotCreds
""")] """)]
public ICollection<ulong> OwnerIds { get; set; } public ICollection<ulong> OwnerIds { get; set; }
[Comment("""
List of Ids of the users who have bot admin permissions
**DO NOT ADD PEOPLE YOU DON'T TRUST**
""")]
public ICollection<ulong> AdminIds { get; set; }
[Comment( [Comment(
"Keep this on 'true' unless you're sure your bot shouldn't use privileged intents or you're waiting to be accepted")] "Keep this on 'true' unless you're sure your bot shouldn't use privileged intents or you're waiting to be accepted")]
public bool UsePrivilegedIntents { get; set; } public bool UsePrivilegedIntents { get; set; }
@ -173,6 +179,7 @@ public sealed class Creds : IBotCreds
Token = string.Empty; Token = string.Empty;
UsePrivilegedIntents = true; UsePrivilegedIntents = true;
OwnerIds = new List<ulong>(); OwnerIds = new List<ulong>();
AdminIds = new List<ulong>();
TotalShards = 1; TotalShards = 1;
GoogleApiKey = string.Empty; GoogleApiKey = string.Empty;
Votes = new VotesSettings(); Votes = new VotesSettings();

View File

@ -73,6 +73,7 @@ public sealed class BotCredsProvider : IBotCredsProvider
lock (_reloadLock) lock (_reloadLock)
{ {
_creds.OwnerIds.Clear(); _creds.OwnerIds.Clear();
_creds.AdminIds.Clear();
_config.Bind(_creds); _config.Bind(_creds);
if (string.IsNullOrWhiteSpace(_creds.Token)) if (string.IsNullOrWhiteSpace(_creds.Token))

View File

@ -10,7 +10,7 @@ public sealed class StatsService : IStatsService, IReadyExecutor, INService
=> typeof(Bot).Assembly.GetName().Version?.ToString(3) ?? "custom"; => typeof(Bot).Assembly.GetName().Version?.ToString(3) ?? "custom";
public string Author public string Author
=> "Kwoth#2452"; => "Kwoth#2452\nWizkiller96#5074";
public double MessagesPerSecond public double MessagesPerSecond
=> MessageCounter / GetUptime().TotalSeconds; => MessageCounter / GetUptime().TotalSeconds;

View File

@ -7,4 +7,10 @@ public static class BotCredentialsExtensions
public static bool IsOwner(this IBotCreds creds, ulong userId) public static bool IsOwner(this IBotCreds creds, ulong userId)
=> creds.OwnerIds.Contains(userId); => creds.OwnerIds.Contains(userId);
public static bool IsAdmin(this IBotCreds creds, IUser user)
=> creds.IsAdmin(user.Id);
public static bool IsAdmin(this IBotCreds creds, ulong userId)
=> creds.AdminIds.Contains(userId);
} }

View File

@ -3148,7 +3148,7 @@
"Module": "Gambling", "Module": "Gambling",
"Options": null, "Options": null,
"Requirements": [ "Requirements": [
"Bot Owner Only" "Bot Staff Only"
] ]
}, },
{ {
@ -3165,7 +3165,7 @@
"Module": "Gambling", "Module": "Gambling",
"Options": null, "Options": null,
"Requirements": [ "Requirements": [
"Bot Owner Only" "Bot Staff Only"
] ]
}, },
{ {
@ -3349,7 +3349,7 @@
"Module": "Gambling", "Module": "Gambling",
"Options": null, "Options": null,
"Requirements": [ "Requirements": [
"Bot Owner Only" "Bot Staff Only"
] ]
}, },
{ {
@ -3364,7 +3364,7 @@
"Module": "Gambling", "Module": "Gambling",
"Options": null, "Options": null,
"Requirements": [ "Requirements": [
"Bot Owner Only" "Bot Staff Only"
] ]
}, },
{ {
@ -4378,13 +4378,31 @@
}, },
{ {
"Aliases": [ "Aliases": [
".countup",
".nunchi" ".nunchi"
], ],
"Description": "Creates or joins an existing nunchi game. Users have to count up by 1 from the starting number shown by the bot. If someone makes a mistake (types an incorrect number, or repeats the same number) they are out of the game and a new round starts without them. Minimum 3 users required.", "Description": "Creates or joins an existing CountUp game.\nBot will show a number - count up from it.\nWhoever writes a duplicate number, or is the last person without a number loses, and a new round starts!\nMinimum 3 users required.",
"Usage": [ "Usage": [
".nunchi" ".countup"
], ],
"Submodule": "NunchiCommands", "Submodule": "CountUpCommands",
"Module": "Games",
"Options": null,
"Requirements": []
},
{
"Aliases": [
".questlog",
".qlog",
".quest",
".quests",
".dailies"
],
"Description": "Shows your active quests and progress.",
"Usage": [
".questlog"
],
"Submodule": "QuestCommands",
"Module": "Games", "Module": "Games",
"Options": null, "Options": null,
"Requirements": [] "Requirements": []
@ -4588,6 +4606,38 @@
"Bot Owner Only" "Bot Owner Only"
] ]
}, },
{
"Aliases": [
".feedback",
".fb"
],
"Description": "Send bug/feedback report to WizBot's Devs.",
"Usage": [
".feedback Bug I found a bug",
".feedback Suggestion I have a suggestion for the bot."
],
"Submodule": "Help",
"Module": "Help",
"Options": null,
"Requirements": [
"Only Public Bot"
]
},
{
"Aliases": [
".report"
],
"Description": "Allows you to report a user who abuse the bot to Bot Staff.",
"Usage": [
".report @User Abused bet flip command."
],
"Submodule": "Help",
"Module": "Help",
"Options": null,
"Requirements": [
"Only Public Bot"
]
},
{ {
"Aliases": [ "Aliases": [
".guide", ".guide",
@ -5607,7 +5657,7 @@
"Module": "Permissions", "Module": "Permissions",
"Options": null, "Options": null,
"Requirements": [ "Requirements": [
"Bot Owner Only" "Bot Staff Only"
] ]
}, },
{ {
@ -5626,7 +5676,7 @@
"Module": "Permissions", "Module": "Permissions",
"Options": null, "Options": null,
"Requirements": [ "Requirements": [
"Bot Owner Only" "Bot Staff Only"
] ]
}, },
{ {
@ -5645,7 +5695,7 @@
"Module": "Permissions", "Module": "Permissions",
"Options": null, "Options": null,
"Requirements": [ "Requirements": [
"Bot Owner Only" "Bot Staff Only"
] ]
}, },
{ {
@ -5932,21 +5982,17 @@
] ]
} }
], ],
"QuestCommands": [ "Roblox": [
{ {
"Aliases": [ "Aliases": [
".questlog", ".rbxinfo"
".qlog",
".quest",
".quests",
".dailies"
], ],
"Description": "Shows your active quests and progress.", "Description": "Display a Roblox User profile information from the Roblox API.",
"Usage": [ "Usage": [
".questlog" ".rbxinfo Roblox"
], ],
"Submodule": "QuestCommands", "Submodule": "Roblox",
"Module": "QuestCommands", "Module": "Roblox",
"Options": null, "Options": null,
"Requirements": [] "Requirements": []
} }
@ -6217,6 +6263,33 @@
"Options": null, "Options": null,
"Requirements": [] "Requirements": []
}, },
{
"Aliases": [
".nya"
],
"Description": "Pulls a random neko image unless a category from http://nekos.life is picked.\n---\n**IMG Categories:**\n`smug`, `woof`, `goose`, `cuddle`, `slap`, `pat`, `gecg`, `feed`, `fox_girl`, `lizard`, `neko`, `hug`, `meow`, `kiss`, `tickle`, `waifu`, `ngif`",
"Usage": [
".nya neko"
],
"Submodule": "Searches",
"Module": "Searches",
"Options": null,
"Requirements": []
},
{
"Aliases": [
".gwaifu",
".genwaifu"
],
"Description": "Responds with a randomly generated waifu.",
"Usage": [
".gwaifu"
],
"Submodule": "Searches",
"Module": "Searches",
"Options": null,
"Requirements": []
},
{ {
"Aliases": [ "Aliases": [
".steam" ".steam"
@ -7182,6 +7255,36 @@
"Options": null, "Options": null,
"Requirements": [] "Requirements": []
}, },
{
"Aliases": [
".donators"
],
"Description": "Displays a list of WizBot Donators.",
"Usage": [
".donators"
],
"Submodule": "Utility",
"Module": "Utility",
"Options": null,
"Requirements": [
"Only Public Bot"
]
},
{
"Aliases": [
".wiznet"
],
"Description": "List information about WizNet and provides a list of current active WizNet Staff.",
"Usage": [
".wiznet"
],
"Submodule": "Utility",
"Module": "Utility",
"Options": null,
"Requirements": [
"Only Public Bot"
]
},
{ {
"Aliases": [ "Aliases": [
".aliasesclear", ".aliasesclear",

View File

@ -5,6 +5,9 @@ token: ''
# List of Ids of the users who have bot owner permissions # List of Ids of the users who have bot owner permissions
# **DO NOT ADD PEOPLE YOU DON'T TRUST** # **DO NOT ADD PEOPLE YOU DON'T TRUST**
ownerIds: [] ownerIds: []
# List of Ids of the users who have bot admin permissions
# **DO NOT ADD PEOPLE YOU DON'T TRUST**
adminIds: []
# Keep this on 'true' unless you're sure your bot shouldn't use privileged intents or you're waiting to be accepted # Keep this on 'true' unless you're sure your bot shouldn't use privileged intents or you're waiting to be accepted
usePrivilegedIntents: true usePrivilegedIntents: true
# The number of shards that the bot will be running on. # The number of shards that the bot will be running on.

View File

@ -3,17 +3,17 @@ version: 11
weatherSeed: w%29';^eGE)9oWHM(aI9I;%1[.r^z2ZS7ShV,l')o(e%#"hVzb>oxQq^`.&/7srh weatherSeed: w%29';^eGE)9oWHM(aI9I;%1[.r^z2ZS7ShV,l')o(e%#"hVzb>oxQq^`.&/7srh
requireCaptcha: true requireCaptcha: true
starEmojis: starEmojis:
- <:emptystar:1326838565786877962> - <:emptystar:1370664496246296657>
- <:onestar:1326838456739168361> - <:onestar:1370664622650163373>
- <:twostar:1326838508198957107> - <:twostar:1370664528643096668>
- <:threestar:1326838525601251429> - <:threestar:1370664548377432084>
- <:fourstar:1326838552520294462> - <:fourstar:1370664563204427867>
spotEmojis: spotEmojis:
- <:ocean:1328519734953771120> - <:ocean:1370664733400891453>
- <:river:1328519754620862504> - <:river:1370664790229254264>
- <:lake:1328315260561788989> - <:lake:1370664760349036574>
- <:swamp:1328519766083633224> - <:swamp:1370664802925678683>
- <:reef:1328519744646545421> - <:reef:1370664776333660200>
chance: chance:
fish: 80 fish: 80
trash: 15 trash: 15
@ -29,7 +29,7 @@ fish:
fluff: Very common. fluff: Very common.
condition: condition:
image: https://cdn.nadeko.bot/fish/bass.png image: https://cdn.nadeko.bot/fish/bass.png
emoji: <:bass:1328520376892002386> emoji: <:bass:1370664835779395604>
trash: trash:
- id: 1002 - id: 1002
name: Plastic Bag name: Plastic Bag
@ -41,7 +41,7 @@ trash:
fluff: Trophy of your contribution to the environment. fluff: Trophy of your contribution to the environment.
condition: condition:
image: https://cdn.nadeko.bot/fish/plasticbag.png image: https://cdn.nadeko.bot/fish/plasticbag.png
emoji: <:plasticbag:1328520895454515211> emoji: <:plasticbag:1370664848668626974>
items: items:
- id: 1 - id: 1
itemType: Pole itemType: Pole

View File

@ -14,6 +14,12 @@ shop:
# True -> Users can access the xp shop using .xpshop command # True -> Users can access the xp shop using .xpshop command
# False -> Users can't access the xp shop # False -> Users can't access the xp shop
isEnabled: false isEnabled: false
# Which patron tier do users need in order to use the .xpshop bgs command
# Leave at 'None' if patron system is disabled, or you don't want any restrictions
bgsTierRequirement: None
# Which patron tier do users need in order to use the .xpshop frames command
# Leave at 'None' if patron system is disabled, or you don't want any restrictions
framesTierRequirement: None
# Frames available for sale. Keys are unique IDs. # Frames available for sale. Keys are unique IDs.
# Do not change keys as they are not publicly visible. Only change properties (name, price, id) # Do not change keys as they are not publicly visible. Only change properties (name, price, id)
# Removing a key which previously existed means that all previous purchases will also be unusable. # Removing a key which previously existed means that all previous purchases will also be unusable.
@ -30,6 +36,8 @@ shop:
preview: preview:
# Optional description of the item # Optional description of the item
desc: desc:
# Optional author of the item
author:
# Backgrounds available for sale. Keys are unique IDs. # Backgrounds available for sale. Keys are unique IDs.
# Do not change keys as they are not publicly visible. Only change properties (name, price, id) # Do not change keys as they are not publicly visible. Only change properties (name, price, id)
# Removing a key which previously existed means that all previous purchases will also be unusable. # Removing a key which previously existed means that all previous purchases will also be unusable.
@ -46,3 +54,5 @@ shop:
preview: preview:
# Optional description of the item # Optional description of the item
desc: desc:
# Optional author of the item
author:

View File

@ -442,7 +442,8 @@ race:
joinrace: joinrace:
- joinrace - joinrace
- jr - jr
nunchi: countup:
- countup
- nunchi - nunchi
connect4: connect4:
- connect4 - connect4
@ -1691,3 +1692,20 @@ fishinv:
fishlb: fishlb:
- fishlb - fishlb
- filb - filb
# WizNet System
feedback:
- feedback
- fb
report:
- report
rbxinfo:
- rbxinfo
wiznet:
- wiznet
donators:
- donators
nya:
- nya
gwaifu:
- gwaifu
- genwaifu

View File

@ -1473,8 +1473,12 @@ joinrace:
params: params:
- amount: - amount:
desc: "The amount to be wagered on the race." desc: "The amount to be wagered on the race."
nunchi: countup:
desc: Creates or joins an existing nunchi game. Users have to count up by 1 from the starting number shown by the bot. If someone makes a mistake (types an incorrect number, or repeats the same number) they are out of the game and a new round starts without them. Minimum 3 users required. desc: |-
Creates or joins an existing CountUp game.
Bot will show a number - count up from it.
Whoever writes a duplicate number, or is the last person without a number loses, and a new round starts!
Minimum 3 users required.
ex: ex:
- '' - ''
params: params:
@ -5273,3 +5277,58 @@ fishlb:
params: params:
- page: - page:
desc: "The optional page to display." desc: "The optional page to display."
feedback:
desc: "Send bug/feedback report to WizBot's Devs."
ex:
- "Bug I found a bug"
- "Suggestion I have a suggestion for the bot."
params:
- category:
desc: "The category your report feedback falls under."
- msg:
desc: "The message of your feedback report that will be sent."
report:
desc: "Allows you to report a user who abuse the bot to Bot Staff."
ex:
- "@User Abused bet flip command."
params:
- user:
desc: "The user being reported for abuse."
- msg:
desc: "The report message explaining what user did that was consider abuse."
rbxinfo:
desc: "Display a Roblox User profile information from the Roblox API."
ex:
- "Roblox"
params:
- user:
desc: "The Roblox username of the user you want to look up."
wiznet:
desc: "List information about WizNet and provides a list of current active WizNet Staff."
ex:
- ""
params:
- {}
donators:
desc: "Displays a list of WizBot Donators."
ex:
- ""
params:
- {}
nya:
desc: |-
Pulls a random neko image unless a category from http://nekos.life is picked.
---
**IMG Categories:**
`smug`, `woof`, `goose`, `cuddle`, `slap`, `pat`, `gecg`, `feed`, `fox_girl`, `lizard`, `neko`, `hug`, `meow`, `kiss`, `tickle`, `waifu`, `ngif`
ex:
- "neko"
params:
- category:
desc: "The image category you want to pull a random image from."
gwaifu:
desc: "Responds with a randomly generated waifu."
ex:
- ""
params:
- {}

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "", "connect4_failed_to_start": "",
"connect4_draw": "", "connect4_draw": "",
"connect4_won": "", "connect4_won": "",
"nunchi_joined": "", "countup_oined": "",
"nunchi_ended": "", "countup_ended": "",
"nunchi_ended_no_winner": "", "countup_ended_no_winner": "",
"nunchi_round_ended": "", "countup_round_ended": "",
"nunchi_round_ended_boot": "", "countup_round_ended_boot": "",
"nunchi_round_started": "", "countup_round_started": "",
"nunchi_next_number": "", "countup_next_number": "",
"nunchi_failed_to_start": "", "countup_failed_to_start": "",
"nunchi_created": "", "countup_created": "",
"stream_role_enabled": "", "stream_role_enabled": "",
"stream_role_disabled": "", "stream_role_disabled": "",
"stream_role_kw_set": "", "stream_role_kw_set": "",
@ -791,7 +791,7 @@
"perm_override": "", "perm_override": "",
"define_unknown": "", "define_unknown": "",
"queue_stopped": "", "queue_stopped": "",
"nunchi_started": "", "countup_started": "",
"bot_strings_reloaded": "", "bot_strings_reloaded": "",
"xpn_setting_global": "", "xpn_setting_global": "",
"xpn_setting_server": "", "xpn_setting_server": "",

View File

@ -720,16 +720,16 @@
"waifu_gift": "Darováno {0} {1}", "waifu_gift": "Darováno {0} {1}",
"waifu_gift_shop": "Obchod dárků pro waifu", "waifu_gift_shop": "Obchod dárků pro waifu",
"gifts": "Dárky", "gifts": "Dárky",
"nunchi_joined": "Připojen k nunchi hře.{0} uživatelů se již připojilo.", "countup_oined": "Připojen k nunchi hře.{0} uživatelů se již připojilo.",
"nunchi_ended": "Nunchi hra skončila. {0} vyhrál", "countup_ended": "Nunchi hra skončila. {0} vyhrál",
"nunchi_ended_no_winner": "Nunchi hra skončila bez vítěze.", "countup_ended_no_winner": "Nunchi hra skončila bez vítěze.",
"nunchi_started": "Nunchi hra začala s {0} účastníky", "countup_started": "Nunchi hra začala s {0} účastníky",
"nunchi_round_ended": "Kolo hry Nunchi skončilo. {0} je mimo hru.", "countup_round_ended": "Kolo hry Nunchi skončilo. {0} je mimo hru.",
"nunchi_round_ended_boot": "Kolo hry Nunchi skončilo kvůli vypršení času pro některé uživatele. Tito uživatelé stále ještě hrají: {0}", "countup_round_ended_boot": "Kolo hry Nunchi skončilo kvůli vypršení času pro některé uživatele. Tito uživatelé stále ještě hrají: {0}",
"nunchi_round_started": "Kolo hry Nunchi začalo s {0} uživateli. Začni počítat od čísla {1}.", "countup_round_started": "Kolo hry Nunchi začalo s {0} uživateli. Začni počítat od čísla {1}.",
"nunchi_next_number": "Číslo registrováno. Poslední číslo bylo {0}.", "countup_next_number": "Číslo registrováno. Poslední číslo bylo {0}.",
"nunchi_failed_to_start": "Hru Nunchi se nepodařilo spustit z důvodu nedostatku účastníků.", "countup_failed_to_start": "Hru Nunchi se nepodařilo spustit z důvodu nedostatku účastníků.",
"nunchi_created": "Hra Nunchi byla vytvořena. Čekám na připojení uživatelů.", "countup_created": "Hra Nunchi byla vytvořena. Čekám na připojení uživatelů.",
"sad_enabled": "Písně budou mazány ze seznamu přehrávání, když skončí.", "sad_enabled": "Písně budou mazány ze seznamu přehrávání, když skončí.",
"sad_disabled": "Písně nebudou mazány ze seznamu přehrávání, když skončí.", "sad_disabled": "Písně nebudou mazány ze seznamu přehrávání, když skončí.",
"stream_role_enabled": "Když uživatel z role {0} začne streamovat, dám mu roli {1}.", "stream_role_enabled": "Když uživatel z role {0} začne streamovat, dám mu roli {1}.",

View File

@ -720,16 +720,16 @@
"waifu_gift": "Gav {0} til {1}", "waifu_gift": "Gav {0} til {1}",
"waifu_gift_shop": "Waifu gavebutik", "waifu_gift_shop": "Waifu gavebutik",
"gifts": "Gaver", "gifts": "Gaver",
"nunchi_joined": "deltager i nunchi spil. {0} spillere ind til videre.", "countup_oined": "deltager i nunchi spil. {0} spillere ind til videre.",
"nunchi_ended": "Nunchi spil afsluttet. {0} vandt.", "countup_ended": "Nunchi spil afsluttet. {0} vandt.",
"nunchi_ended_no_winner": "Nunchi spil afsluttet med ingen vinder.", "countup_ended_no_winner": "Nunchi spil afsluttet med ingen vinder.",
"nunchi_started": "Nunchi spil startet med {0} deltagere.", "countup_started": "Nunchi spil startet med {0} deltagere.",
"nunchi_round_ended": "Nunchi runde afsluttet. {0} er ude af spillet.", "countup_round_ended": "Nunchi runde afsluttet. {0} er ude af spillet.",
"nunchi_round_ended_boot": "Nunchi runde afsluttet pga. timeout hos nogle brugere. Disse brugere er stadig i spillet: {0}", "countup_round_ended_boot": "Nunchi runde afsluttet pga. timeout hos nogle brugere. Disse brugere er stadig i spillet: {0}",
"nunchi_round_started": "Nunchi runde started med {0} brugere. Begynd at tælle fra tallet {1}.", "countup_round_started": "Nunchi runde started med {0} brugere. Begynd at tælle fra tallet {1}.",
"nunchi_next_number": "Nummer registreret. Sidste nummer var {0}.", "countup_next_number": "Nummer registreret. Sidste nummer var {0}.",
"nunchi_failed_to_start": "Nunchi kunne ikke startes fordi der ikke var nok deltagere.", "countup_failed_to_start": "Nunchi kunne ikke startes fordi der ikke var nok deltagere.",
"nunchi_created": "Nunchi spil oprettet. Venter på brugere der vil deltage.", "countup_created": "Nunchi spil oprettet. Venter på brugere der vil deltage.",
"sad_enabled": "Sange vil blive slettet fra musikkøen når de er færdige med at spille.", "sad_enabled": "Sange vil blive slettet fra musikkøen når de er færdige med at spille.",
"sad_disabled": "Sange vil ikke længere blive slettet fra musikkøen når de er færdige med at spille.", "sad_disabled": "Sange vil ikke længere blive slettet fra musikkøen når de er færdige med at spille.",
"stream_role_enabled": "Når en bruger fra {0} rolle begynder at streame, vil jeg give dem {1} rolle.", "stream_role_enabled": "Når en bruger fra {0} rolle begynder at streame, vil jeg give dem {1} rolle.",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "Vier Gewinnt Spiel konnte nicht gestartet werden, da keiner beigetreten ist.", "connect4_failed_to_start": "Vier Gewinnt Spiel konnte nicht gestartet werden, da keiner beigetreten ist.",
"connect4_draw": "Vier Gewinnt Spiel endete in einem Unentschieden.", "connect4_draw": "Vier Gewinnt Spiel endete in einem Unentschieden.",
"connect4_won": "{0} hat das Vier Gewinnt Spiel gegen {1} gewonnen.", "connect4_won": "{0} hat das Vier Gewinnt Spiel gegen {1} gewonnen.",
"nunchi_joined": "Du bist dem Nunchi Spiel beigetreten. {0} sind bis jetzt beigetreten.", "countup_oined": "Du bist dem Nunchi Spiel beigetreten. {0} sind bis jetzt beigetreten.",
"nunchi_ended": "Das Nunchi Spiel wurde beendet. {0} hat gewonnen.", "countup_ended": "Das Nunchi Spiel wurde beendet. {0} hat gewonnen.",
"nunchi_ended_no_winner": "Das Nunchi Spiel wurde ohne einen Gewinner beendet.", "countup_ended_no_winner": "Das Nunchi Spiel wurde ohne einen Gewinner beendet.",
"nunchi_round_ended": "Nunchi Runde wurde beendet. {0} ist aus dem Spiel.", "countup_round_ended": "Nunchi Runde wurde beendet. {0} ist aus dem Spiel.",
"nunchi_round_ended_boot": "Nunchi Runde wurde beendet da ein Nutzer einen Time-out hat. Diese Nutzer sind noch im Spiel: {0}", "countup_round_ended_boot": "Nunchi Runde wurde beendet da ein Nutzer einen Time-out hat. Diese Nutzer sind noch im Spiel: {0}",
"nunchi_round_started": "Ninchi Runde hat mit {0} Benutzern gestartet. Fang an zu Zählen ab der Nummer {1}.", "countup_round_started": "Ninchi Runde hat mit {0} Benutzern gestartet. Fang an zu Zählen ab der Nummer {1}.",
"nunchi_next_number": "Nummer registriert. Die letzte Nummer war {0}.", "countup_next_number": "Nummer registriert. Die letzte Nummer war {0}.",
"nunchi_failed_to_start": "Das Nunchi Spiel konnte nicht gestartet werden, da es nicht genug Teilnehmer gibt. ", "countup_failed_to_start": "Das Nunchi Spiel konnte nicht gestartet werden, da es nicht genug Teilnehmer gibt. ",
"nunchi_created": "Nunchi Spiel wurde gestartet. Es wird darauf gewartet das Nutzer beitreten.", "countup_created": "Nunchi Spiel wurde gestartet. Es wird darauf gewartet das Nutzer beitreten.",
"stream_role_enabled": "Wenn ein Nutzer der Rolle {0} anfängt zu Streamen, werde ich ihm die Rolle {1} geben.", "stream_role_enabled": "Wenn ein Nutzer der Rolle {0} anfängt zu Streamen, werde ich ihm die Rolle {1} geben.",
"stream_role_disabled": "Stream Rollen Funktionen wurde deaktiviert.", "stream_role_disabled": "Stream Rollen Funktionen wurde deaktiviert.",
"stream_role_kw_set": "Streamer benötigen das Schlüsselwort {0} um die Streamer Rolle zu erhalten.", "stream_role_kw_set": "Streamer benötigen das Schlüsselwort {0} um die Streamer Rolle zu erhalten.",
@ -791,7 +791,7 @@
"perm_override": "Nutzer benötigen die Berechtigung {0}, um den {1} Befehl auszuführen.", "perm_override": "Nutzer benötigen die Berechtigung {0}, um den {1} Befehl auszuführen.",
"define_unknown": "Die Definition des Begriffs wurde nicht gefunden.", "define_unknown": "Die Definition des Begriffs wurde nicht gefunden.",
"queue_stopped": "Player ist pausiert. Benutze den {0} Befehl um die Wiedergabe zu starten.", "queue_stopped": "Player ist pausiert. Benutze den {0} Befehl um die Wiedergabe zu starten.",
"nunchi_started": "Nunchi Spiel gestartet mit {0} Teilnehmern.", "countup_started": "Nunchi Spiel gestartet mit {0} Teilnehmern.",
"bot_strings_reloaded": "Bot Strings wurden neu geladen.", "bot_strings_reloaded": "Bot Strings wurden neu geladen.",
"xpn_setting_global": "Globale Level-Up Benachrichtigungen", "xpn_setting_global": "Globale Level-Up Benachrichtigungen",
"xpn_setting_server": "Server Level-Up Benachrichtigungen", "xpn_setting_server": "Server Level-Up Benachrichtigungen",

View File

@ -610,6 +610,7 @@
"no_topic_set": "No topic set.", "no_topic_set": "No topic set.",
"owner": "Owner", "owner": "Owner",
"owner_ids": "Owner IDs", "owner_ids": "Owner IDs",
"admin_ids": "Admin IDs",
"presence": "Presence", "presence": "Presence",
"presence_txt": "{0} Servers\n{1} Text Channels\n{2} Voice Channels", "presence_txt": "{0} Servers\n{1} Text Channels\n{2} Voice Channels",
"quotes_deleted": "Deleted all quotes with {0} keyword.", "quotes_deleted": "Deleted all quotes with {0} keyword.",
@ -806,16 +807,16 @@
"connect4_failed_to_start": "Connect4 game failed to start because nobody joined.", "connect4_failed_to_start": "Connect4 game failed to start because nobody joined.",
"connect4_draw": "Connect4 game ended in a draw.", "connect4_draw": "Connect4 game ended in a draw.",
"connect4_won": "{0} won the game of Connect4 against {1}.", "connect4_won": "{0} won the game of Connect4 against {1}.",
"nunchi_joined": "Joined nunchi game. {0} users joined so far.", "countup_joined": "Joined CountUp game. {0} users joined so far.",
"nunchi_ended": "Nunchi game ended. {0} won", "countup_ended": "CountUp game ended. {0} won",
"nunchi_ended_no_winner": "Nunchi game ended with no winner.", "countup_ended_no_winner": "CountUp game ended with no winner.",
"nunchi_started": "Nunchi game started with {0} participants.", "countup_started": "CountUp game started with {0} participants.",
"nunchi_round_ended": "Nunchi round ended. {0} is out of the game.", "countup_round_ended": "CountUp round ended. {0} is out of the game.",
"nunchi_round_ended_boot": "Nunchi round ended due to timeout of some users. These users are still in the game: {0}", "countup_round_ended_boot": "CountUp round ended due to timeout of some users. These users are still in the game: {0}",
"nunchi_round_started": "Nunchi round started with {0} users. Start counting from the number {1}.", "countup_round_started": "CountUp round started with {0} users. Start counting from the number {1}.",
"nunchi_next_number": "Number registered. Last number was {0}.", "countup_next_number": "Number registered. Last number was {0}.",
"nunchi_failed_to_start": "Nunchi failed to start because there were not enough participants.", "countup_failed_to_start": "CountUp failed to start because there were not enough participants.",
"nunchi_created": "Nunchi game created. Waiting for users to join.", "countup_created": "CountUp game created. Waiting for users to join.",
"stream_role_enabled": "When a user from {0} role starts streaming, I will give them {1} role.", "stream_role_enabled": "When a user from {0} role starts streaming, I will give them {1} role.",
"stream_role_disabled": "Stream role feature has been disabled.", "stream_role_disabled": "Stream role feature has been disabled.",
"stream_role_kw_set": "Streamers now require {0} keyword in order to receive the role.", "stream_role_kw_set": "Streamers now require {0} keyword in order to receive the role.",
@ -994,7 +995,7 @@
"module_page_empty": "No module on this page.", "module_page_empty": "No module on this page.",
"module_description_help": "Get command help, descriptions and usage examples", "module_description_help": "Get command help, descriptions and usage examples",
"module_description_gambling": "Bet on dice rolls, blackjack, slots, coinflips and others", "module_description_gambling": "Bet on dice rolls, blackjack, slots, coinflips and others",
"module_description_games": "Play trivia, nunchi, hangman, connect4 and other games", "module_description_games": "Play trivia, countup, hangman, connect4 and other games",
"module_description_music": "Play music from youtube, local files and radio streams", "module_description_music": "Play music from youtube, local files and radio streams",
"module_description_utility": "Manage custom quotes, repeating messages and check facts about the server", "module_description_utility": "Manage custom quotes, repeating messages and check facts about the server",
"module_description_administration": "Moderation, punish users, setup self assignable roles and greet messages", "module_description_administration": "Moderation, punish users, setup self assignable roles and greet messages",
@ -1003,6 +1004,7 @@
"module_description_searches": "Search for jokes, images of animals, anime and manga", "module_description_searches": "Search for jokes, images of animals, anime and manga",
"module_description_xp": "Gain xp based on chat activity, check users' xp cards", "module_description_xp": "Gain xp based on chat activity, check users' xp cards",
"module_description_medusa": "**Bot Owner only.** Load, unload and handle dynamic modules.", "module_description_medusa": "**Bot Owner only.** Load, unload and handle dynamic modules.",
"module_description_roblox": "Get roblox data from Roblox's API.",
"module_description_patronage": "Commands related to supporting the bot", "module_description_patronage": "Commands related to supporting the bot",
"module_description_missing": "Description is missing for this module.", "module_description_missing": "Description is missing for this module.",
"purge_user_confirm": "Are you sure that you want to purge {0} from the database?", "purge_user_confirm": "Are you sure that you want to purge {0} from the database?",
@ -1020,8 +1022,8 @@
"linkonly_disable": "This channel is no longer link-only.", "linkonly_disable": "This channel is no longer link-only.",
"deleted_x_servers": "Deleted {0} servers.", "deleted_x_servers": "Deleted {0} servers.",
"curtr_gift": "Gift from {0} [{1}]", "curtr_gift": "Gift from {0} [{1}]",
"curtr_award": "Awarded by bot owner {0} [{1}]", "curtr_award": "Awarded by bot staff {0} [{1}]",
"curtr_take": "Taken by bot owner {0} [{1}]", "curtr_take": "Taken by bot staff {0} [{1}]",
"list_of_medusae": "List of Medusae", "list_of_medusae": "List of Medusae",
"list_of_unloaded": "List of Available Medusae", "list_of_unloaded": "List of Available Medusae",
"medusa_name_not_found": "Medusa with that name doesn't exist or isn't loaded.", "medusa_name_not_found": "Medusa with that name doesn't exist or isn't loaded.",
@ -1065,6 +1067,7 @@
"patron_insuff_tier": "Your Patron Tier insufficient to perform this action.", "patron_insuff_tier": "Your Patron Tier insufficient to perform this action.",
"xpshop_already_owned": "You already own this item.", "xpshop_already_owned": "You already own this item.",
"xpshop_item_not_found": "An item with that key doesn't exist.", "xpshop_item_not_found": "An item with that key doesn't exist.",
"xpshop_required_tier": "Required Tier",
"sticker_error": "You must either send a sticker along with this command, or upload a 300x300 .png or .apng image. Up to 512KB in size.", "sticker_error": "You must either send a sticker along with this command, or upload a 300x300 .png or .apng image. Up to 512KB in size.",
"sticker_missing_name": "Please specify a name for the sticker.", "sticker_missing_name": "Please specify a name for the sticker.",
"thread_deleted": "Thread Deleted", "thread_deleted": "Thread Deleted",
@ -1204,7 +1207,6 @@
"userrole_icon_success": "The icon for {0} has been saved.", "userrole_icon_success": "The icon for {0} has been saved.",
"userrole_icon_fail": "Failed to set the role icon.", "userrole_icon_fail": "Failed to set the role icon.",
"userrole_icon_invalid": "The role icon cannot be empty.", "userrole_icon_invalid": "The role icon cannot be empty.",
"userrole_hierarchy_error": "You can't assign or modify roles that are higher than or equal to your, or bots highest role.",
"userrole_role_not_exists": "That role doesn't exist.", "userrole_role_not_exists": "That role doesn't exist.",
"whos_playing_game": "{0} users are playing {1}", "whos_playing_game": "{0} users are playing {1}",
"schedule_list_title": "Scheduled Commands", "schedule_list_title": "Scheduled Commands",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "El juego Conecta 4 no ha podido iniciarse porque nadie se unió.", "connect4_failed_to_start": "El juego Conecta 4 no ha podido iniciarse porque nadie se unió.",
"connect4_draw": "El juego Conecta 4 terminó en empate.", "connect4_draw": "El juego Conecta 4 terminó en empate.",
"connect4_won": "{0} ganó el juego contra {1}.", "connect4_won": "{0} ganó el juego contra {1}.",
"nunchi_joined": "Inicia el juego de Nunchi. {0} usuarios en cola.", "countup_joined": "Inicia el juego de Nunchi. {0} usuarios en cola.",
"nunchi_ended": "Ha finalizado el juego de Nunchi. {0} gana.", "countup_ended": "Ha finalizado el juego de Nunchi. {0} gana.",
"nunchi_ended_no_winner": "El juego terminó sin ganadores.", "countup_ended_no_winner": "El juego terminó sin ganadores.",
"nunchi_round_ended": "Ronda terminada. {0} queda fuera.", "countup_round_ended": "Ronda terminada. {0} queda fuera.",
"nunchi_round_ended_boot": "Terminó la ronda debido a que varios usuarios tardaron. Estos usuarios siguen en juego: {0}", "countup_round_ended_boot": "Terminó la ronda debido a que varios usuarios tardaron. Estos usuarios siguen en juego: {0}",
"nunchi_round_started": "La ronda de Nunchi empezó con {0} usuarios.Empiecen contando desde el {1}.", "countup_round_started": "La ronda de Nunchi empezó con {0} usuarios.Empiecen contando desde el {1}.",
"nunchi_next_number": "Número registrado. El último número fue {0}.", "countup_next_number": "Número registrado. El último número fue {0}.",
"nunchi_failed_to_start": "No se pudo iniciar el juego debido a que no hay suficientes participantes.", "countup_failed_to_start": "No se pudo iniciar el juego debido a que no hay suficientes participantes.",
"nunchi_created": "Juego de Nunchi creado. Esperando usuarios.", "countup_created": "Juego de Nunchi creado. Esperando usuarios.",
"stream_role_enabled": "Cuando un usuario del rol {0} empiece a transmitir, les daré el rol {1}.", "stream_role_enabled": "Cuando un usuario del rol {0} empiece a transmitir, les daré el rol {1}.",
"stream_role_disabled": "Rol de transmisión desactivado.", "stream_role_disabled": "Rol de transmisión desactivado.",
"stream_role_kw_set": "Los que transmitan ahora requerirán la clave {0} para recibir el rol.", "stream_role_kw_set": "Los que transmitan ahora requerirán la clave {0} para recibir el rol.",
@ -791,7 +791,7 @@
"perm_override": "Los usuarios necesitarán el permiso {0} para poder usar el comando {1}.", "perm_override": "Los usuarios necesitarán el permiso {0} para poder usar el comando {1}.",
"define_unknown": "No se pudo encontrar el significado de ese término.", "define_unknown": "No se pudo encontrar el significado de ese término.",
"queue_stopped": "El reproductor se detuvo. Usa el comando {0} para volver a reproducir.", "queue_stopped": "El reproductor se detuvo. Usa el comando {0} para volver a reproducir.",
"nunchi_started": "El juego de Nunchi empezó con {0} participantes.", "countup_started": "El juego de Nunchi empezó con {0} participantes.",
"bot_strings_reloaded": "Se han recargado las cadenas del bots.", "bot_strings_reloaded": "Se han recargado las cadenas del bots.",
"xpn_setting_global": "Notificaciones de subida de nivel globales.", "xpn_setting_global": "Notificaciones de subida de nivel globales.",
"xpn_setting_server": "Notificaciones de subida de nivel en el servidor", "xpn_setting_server": "Notificaciones de subida de nivel en el servidor",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "La partie de Connect4 n'a pas pu démarrer car personne ne l'a rejoint.", "connect4_failed_to_start": "La partie de Connect4 n'a pas pu démarrer car personne ne l'a rejoint.",
"connect4_draw": "La partie de Connect4 a fini sur une égalité.", "connect4_draw": "La partie de Connect4 a fini sur une égalité.",
"connect4_won": "{0} a gagné la partie de Connect4 contre {1}.", "connect4_won": "{0} a gagné la partie de Connect4 contre {1}.",
"nunchi_joined": "Vous avez rejoint la partie de Nunchi. {0} utilisateurs ont joints jusqu'à présent.", "countup_joined": "Vous avez rejoint la partie de Nunchi. {0} utilisateurs ont joints jusqu'à présent.",
"nunchi_ended": "Le partie de Nunchi s'est terminé. {0} a gagné", "countup_ended": "Le partie de Nunchi s'est terminé. {0} a gagné",
"nunchi_ended_no_winner": "Le partie de Nunchi s'est terminé sans vainqueur.", "countup_ended_no_winner": "Le partie de Nunchi s'est terminé sans vainqueur.",
"nunchi_round_ended": "Fin de la manche de Nunchi. {0} est éliminé·e.", "countup_round_ended": "Fin de la manche de Nunchi. {0} est éliminé·e.",
"nunchi_round_ended_boot": "La manche de Nunchi s'est terminé en raison de l'inactivité de certains utilisateurs. Ces utilisateurs sont toujours dans le jeu: {0}", "countup_round_ended_boot": "La manche de Nunchi s'est terminé en raison de l'inactivité de certains utilisateurs. Ces utilisateurs sont toujours dans le jeu: {0}",
"nunchi_round_started": "La manche de Nunchi a commencé avec {0} utilisateurs. Commencez à compter à partir du nombre {1}.", "countup_round_started": "La manche de Nunchi a commencé avec {0} utilisateurs. Commencez à compter à partir du nombre {1}.",
"nunchi_next_number": "Numéro enregistré. Le dernier numéro était {0}.", "countup_next_number": "Numéro enregistré. Le dernier numéro était {0}.",
"nunchi_failed_to_start": "La partie de Nunchi n'a pas pu démarrer car il n'y avait pas assez de participants.", "countup_failed_to_start": "La partie de Nunchi n'a pas pu démarrer car il n'y avait pas assez de participants.",
"nunchi_created": "Une partie de Nunchi a été créé. En attente de la participation d'autres utilisateurs.", "countup_created": "Une partie de Nunchi a été créé. En attente de la participation d'autres utilisateurs.",
"stream_role_enabled": "Lorsqu'un utilisateur du rôle {0} commence à diffuser, je lui donne le rôle {1}.", "stream_role_enabled": "Lorsqu'un utilisateur du rôle {0} commence à diffuser, je lui donne le rôle {1}.",
"stream_role_disabled": "La fonction de rôle diffuseur a été **désactivée**.", "stream_role_disabled": "La fonction de rôle diffuseur a été **désactivée**.",
"stream_role_kw_set": "Les diffuseurs nécessitent désormais le mot-clé {0} pour recevoir le rôle.", "stream_role_kw_set": "Les diffuseurs nécessitent désormais le mot-clé {0} pour recevoir le rôle.",
@ -791,7 +791,7 @@
"perm_override": "Les utilisateurs auront besoin de l'autorisation {0} pour exécuter la commande {1}.", "perm_override": "Les utilisateurs auront besoin de l'autorisation {0} pour exécuter la commande {1}.",
"define_unknown": "N'arrive pas à trouver une définition à ce terme.", "define_unknown": "N'arrive pas à trouver une définition à ce terme.",
"queue_stopped": "La lecture est arrêtée. Utilisez la commande {0} pour commencer à jouer.", "queue_stopped": "La lecture est arrêtée. Utilisez la commande {0} pour commencer à jouer.",
"nunchi_started": "Jeu de Nunchi a commencé avec {0} participants.", "countup_started": "Jeu de Nunchi a commencé avec {0} participants.",
"bot_strings_reloaded": "Les chaînes de caractères du bot ont été mises à jour.", "bot_strings_reloaded": "Les chaînes de caractères du bot ont été mises à jour.",
"xpn_setting_global": "Notifications de montée en niveau Global", "xpn_setting_global": "Notifications de montée en niveau Global",
"xpn_setting_server": "Notifications de montée en niveau du Server", "xpn_setting_server": "Notifications de montée en niveau du Server",

View File

@ -720,16 +720,16 @@
"waifu_gift": "הביא במתנה {0} ל {1}.", "waifu_gift": "הביא במתנה {0} ל {1}.",
"waifu_gift_shop": "Waifu חנות מתנות", "waifu_gift_shop": "Waifu חנות מתנות",
"gifts": "מתנות", "gifts": "מתנות",
"nunchi_joined": "התחבר למשחק נונצ\u0027י. {0} משתמשים התחברו עד עכשיו.", "countup_joined": "התחבר למשחק נונצ\u0027י. {0} משתמשים התחברו עד עכשיו.",
"nunchi_ended": "משחק נונצ\u0027י הסתיים. {0} ניצח.", "countup_ended": "משחק נונצ\u0027י הסתיים. {0} ניצח.",
"nunchi_ended_no_winner": "משחק נונצ\u0027י נגמר ללא מנצח.", "countup_ended_no_winner": "משחק נונצ\u0027י נגמר ללא מנצח.",
"nunchi_started": "משחק נונצ\u0027י התחיל עם {0} משתתפים.", "countup_started": "משחק נונצ\u0027י התחיל עם {0} משתתפים.",
"nunchi_round_ended": "סיבוב של נונצ\u0027י הסתיים. {0} מחוץ למשחק.", "countup_round_ended": "סיבוב של נונצ\u0027י הסתיים. {0} מחוץ למשחק.",
"nunchi_round_ended_boot": "סיבוב של נונצ\u0027י הסתיים בגלל פסק זמן של מספר משתמשים. אלה הם המשתתפים שעדיין במשחק: {0}", "countup_round_ended_boot": "סיבוב של נונצ\u0027י הסתיים בגלל פסק זמן של מספר משתמשים. אלה הם המשתתפים שעדיין במשחק: {0}",
"nunchi_round_started": "סיבוב נונצ\u0027י התחיל עם {0} משתתפים. תתחילו לספור מהמספר {1}.", "countup_round_started": "סיבוב נונצ\u0027י התחיל עם {0} משתתפים. תתחילו לספור מהמספר {1}.",
"nunchi_next_number": "מספר נרשם. המספר האחרון היה {0}.", "countup_next_number": "מספר נרשם. המספר האחרון היה {0}.",
"nunchi_failed_to_start": "משחק נונצ\u0027י לא התחיל כי לא היו מספיק משתתפים.", "countup_failed_to_start": "משחק נונצ\u0027י לא התחיל כי לא היו מספיק משתתפים.",
"nunchi_created": "משחק נונצ\u0027י נוצר. מחכים לעוד משתמשים שיצטרפו.", "countup_created": "משחק נונצ\u0027י נוצר. מחכים לעוד משתמשים שיצטרפו.",
"sad_enabled": "שירים ימחקו מרשימת השירים כשהם יסתיימו להתנגן.", "sad_enabled": "שירים ימחקו מרשימת השירים כשהם יסתיימו להתנגן.",
"sad_disabled": "שירים לא ימחקו יותר מרשימת השירים כשיסתיימו להתנגן.", "sad_disabled": "שירים לא ימחקו יותר מרשימת השירים כשיסתיימו להתנגן.",
"stream_role_enabled": "כשמשתמש מתפקיד {0} מתחיל שידור חי, אני אביא לו את תפקיד {1}.", "stream_role_enabled": "כשמשתמש מתפקיד {0} מתחיל שידור חי, אני אביא לו את תפקיד {1}.",

View File

@ -720,16 +720,16 @@
"waifu_gift": "{0} ajándékozva {1} által", "waifu_gift": "{0} ajándékozva {1} által",
"waifu_gift_shop": "Waifu ajándékbolt", "waifu_gift_shop": "Waifu ajándékbolt",
"gifts": "Ajándékok", "gifts": "Ajándékok",
"nunchi_joined": "Csatlakozva a nunchi játékhoz. {0} felhasználó csatlakozott eddig", "countup_joined": "Csatlakozva a nunchi játékhoz. {0} felhasználó csatlakozott eddig",
"nunchi_ended": "Nunchi játék véget ért. {0} nyert", "countup_ended": "Nunchi játék véget ért. {0} nyert",
"nunchi_ended_no_winner": "A nunchi játék győztes nélkül ért véget.", "countup_ended_no_winner": "A nunchi játék győztes nélkül ért véget.",
"nunchi_started": "A nunchi játék elkezdődött {0} résztvevővel.", "countup_started": "A nunchi játék elkezdődött {0} résztvevővel.",
"nunchi_round_ended": "Nunchi kör vége. {0} kiesett a játékból.", "countup_round_ended": "Nunchi kör vége. {0} kiesett a játékból.",
"nunchi_round_ended_boot": "Nunchi kör véget ért játékosok időtúllépése miatt. Ezek a játékosok vannak még játékban: {0}", "countup_round_ended_boot": "Nunchi kör véget ért játékosok időtúllépése miatt. Ezek a játékosok vannak még játékban: {0}",
"nunchi_round_started": "Nunchi kör elkezdődött {0} játékossal. Kezdjétek a számolást {1} számtól.", "countup_round_started": "Nunchi kör elkezdődött {0} játékossal. Kezdjétek a számolást {1} számtól.",
"nunchi_next_number": "Szám regisztrálva. Utolsó szám {1} volt.", "countup_next_number": "Szám regisztrálva. Utolsó szám {1} volt.",
"nunchi_failed_to_start": "Nunchi kör elindítása sikertelen nem elég résztvevő miatt.", "countup_failed_to_start": "Nunchi kör elindítása sikertelen nem elég résztvevő miatt.",
"nunchi_created": "Nunchi játék elkészült. Várakozás játékosok csatlakozására.", "countup_created": "Nunchi játék elkészült. Várakozás játékosok csatlakozására.",
"sad_enabled": "A zenék ki lesznek törölve a sorból, mikor vége a lejátszásuknak.", "sad_enabled": "A zenék ki lesznek törölve a sorból, mikor vége a lejátszásuknak.",
"sad_disabled": "A zenék nem lesznek többé törölve a sorból, mikor vége a lejátszásuknak.", "sad_disabled": "A zenék nem lesznek többé törölve a sorból, mikor vége a lejátszásuknak.",
"stream_role_enabled": "Mikor a felhasználó {0} rangról elkezd streamelni, odaadom nekik a(z) {1} rangot.", "stream_role_enabled": "Mikor a felhasználó {0} rangról elkezd streamelni, odaadom nekik a(z) {1} rangot.",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "Game Connect4 gagal dimulai karena tidak ada yang bergabung.", "connect4_failed_to_start": "Game Connect4 gagal dimulai karena tidak ada yang bergabung.",
"connect4_draw": "Game Connect4 berakhir seimbang.", "connect4_draw": "Game Connect4 berakhir seimbang.",
"connect4_won": "{0} memenangkan game Connect4 melawan {1}", "connect4_won": "{0} memenangkan game Connect4 melawan {1}",
"nunchi_joined": "Bergabung dengan Game Nunchi. {0} pengguna bergabung sejauh ini.", "countup_joined": "Bergabung dengan Game Nunchi. {0} pengguna bergabung sejauh ini.",
"nunchi_ended": "Game Nunchi berakhir. {0} menang", "countup_ended": "Game Nunchi berakhir. {0} menang",
"nunchi_ended_no_winner": "Game Nunchi berakhir tanpa ada pemenang.", "countup_ended_no_winner": "Game Nunchi berakhir tanpa ada pemenang.",
"nunchi_round_ended": "Ronde Game Nunchi berakhir. {0} meninggalkan game.", "countup_round_ended": "Ronde Game Nunchi berakhir. {0} meninggalkan game.",
"nunchi_round_ended_boot": "Ronde Nunchi berakhir karena batas waktu beberapa pengguna. Pengguna berikut masih dalam game: {0}", "countup_round_ended_boot": "Ronde Nunchi berakhir karena batas waktu beberapa pengguna. Pengguna berikut masih dalam game: {0}",
"nunchi_round_started": "Game Nunchi dimulai dengan {0} pengguna. Mulai menghitung dari angka {1}.", "countup_round_started": "Game Nunchi dimulai dengan {0} pengguna. Mulai menghitung dari angka {1}.",
"nunchi_next_number": "Nomor telah terdaftar. Nomor terakhir adalah {0}.", "countup_next_number": "Nomor telah terdaftar. Nomor terakhir adalah {0}.",
"nunchi_failed_to_start": "Nunchi gagal memulai karena tidak cukup banyak peserta.", "countup_failed_to_start": "Nunchi gagal memulai karena tidak cukup banyak peserta.",
"nunchi_created": "Game Nunchi dibuat. Menunggu pengguna bergabung.", "countup_created": "Game Nunchi dibuat. Menunggu pengguna bergabung.",
"stream_role_enabled": "Ketika pengguna dari role {0} mulai melakukan streaming, saya akan memberikan role {1}.", "stream_role_enabled": "Ketika pengguna dari role {0} mulai melakukan streaming, saya akan memberikan role {1}.",
"stream_role_disabled": "Fitur role streaming telah dinonaktifkan.", "stream_role_disabled": "Fitur role streaming telah dinonaktifkan.",
"stream_role_kw_set": "Streamer sekarang membutuhkan kata kunci {0} kuntuk menerima role.", "stream_role_kw_set": "Streamer sekarang membutuhkan kata kunci {0} kuntuk menerima role.",
@ -791,7 +791,7 @@
"perm_override": "Pengguna akan harus mempunyai {0} permisi untuk menjalankan {1} perintah.", "perm_override": "Pengguna akan harus mempunyai {0} permisi untuk menjalankan {1} perintah.",
"define_unknown": "Tidak dapat definisi untuk kata tersebut.", "define_unknown": "Tidak dapat definisi untuk kata tersebut.",
"queue_stopped": "Pemain music telah berhenti. Pakai {0} perintah untuk memulai pemain music.", "queue_stopped": "Pemain music telah berhenti. Pakai {0} perintah untuk memulai pemain music.",
"nunchi_started": "Permanian Nunchi mulai dengan {0} peserta.", "countup_started": "Permanian Nunchi mulai dengan {0} peserta.",
"bot_strings_reloaded": "String bot telah di muat ulang.", "bot_strings_reloaded": "String bot telah di muat ulang.",
"xpn_setting_global": "Notifikasi Level-Up global", "xpn_setting_global": "Notifikasi Level-Up global",
"xpn_setting_server": "Notifikasi Level-Up server", "xpn_setting_server": "Notifikasi Level-Up server",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "Partita a Forza Quattro non è iniziata perché nessuno è entrato.", "connect4_failed_to_start": "Partita a Forza Quattro non è iniziata perché nessuno è entrato.",
"connect4_draw": "Partita a Forza Quattro conclusa in parità.", "connect4_draw": "Partita a Forza Quattro conclusa in parità.",
"connect4_won": "{0} ha vinto la partita a Forza Quattro contro {1}.", "connect4_won": "{0} ha vinto la partita a Forza Quattro contro {1}.",
"nunchi_joined": "Entrato in partita di Nunchi. {}", "countup_joined": "Entrato in partita di Nunchi. {}",
"nunchi_ended": "Partita di Nunchi conclusa. {0} ha vinto.", "countup_ended": "Partita di Nunchi conclusa. {0} ha vinto.",
"nunchi_ended_no_winner": "Partita di Nunchi conclusa senza alcun vincitore.", "countup_ended_no_winner": "Partita di Nunchi conclusa senza alcun vincitore.",
"nunchi_round_ended": "Round di Nunchi concluso. {0} è uscito dalla partita.", "countup_round_ended": "Round di Nunchi concluso. {0} è uscito dalla partita.",
"nunchi_round_ended_boot": "Round di Nunchi concluso per tempo scaduto di alcuni utenti. Questi utenti sono ancora in gioco: {0}", "countup_round_ended_boot": "Round di Nunchi concluso per tempo scaduto di alcuni utenti. Questi utenti sono ancora in gioco: {0}",
"nunchi_round_started": "Round di Nunchi iniziato con {0} utenti. Inizia a contare dal numero {1}.", "countup_round_started": "Round di Nunchi iniziato con {0} utenti. Inizia a contare dal numero {1}.",
"nunchi_next_number": "Numero registrato. L'ultimo numero è {0}.", "countup_next_number": "Numero registrato. L'ultimo numero è {0}.",
"nunchi_failed_to_start": "Partita di nunchi non iniziata perché non c'erano abbastanza partecipanti.", "countup_failed_to_start": "Partita di nunchi non iniziata perché non c'erano abbastanza partecipanti.",
"nunchi_created": "Partita di nunchi creata. Aspettando che gli utenti entrino.", "countup_created": "Partita di nunchi creata. Aspettando che gli utenti entrino.",
"stream_role_enabled": "Quando un utente con il ruolo {0} inizia a trasmettere, gli darò il ruolo {1}.", "stream_role_enabled": "Quando un utente con il ruolo {0} inizia a trasmettere, gli darò il ruolo {1}.",
"stream_role_disabled": "Funzionalità del ruolo di trasmissione disabilitato.", "stream_role_disabled": "Funzionalità del ruolo di trasmissione disabilitato.",
"stream_role_kw_set": "Gli streamer ora devono avere la parola chiave {0} per ricevere il ruolo.", "stream_role_kw_set": "Gli streamer ora devono avere la parola chiave {0} per ricevere il ruolo.",
@ -791,7 +791,7 @@
"perm_override": "Gli utenti necessitano di {0} permessi per poter utilizzare il comando {1}.", "perm_override": "Gli utenti necessitano di {0} permessi per poter utilizzare il comando {1}.",
"define_unknown": "Non trovo la definizione per quel termine.", "define_unknown": "Non trovo la definizione per quel termine.",
"queue_stopped": "", "queue_stopped": "",
"nunchi_started": "Partita a nunchi iniziata con {0} partecipanti.", "countup_started": "Partita a nunchi iniziata con {0} partecipanti.",
"bot_strings_reloaded": "", "bot_strings_reloaded": "",
"xpn_setting_global": "Notifica di level-up globale.", "xpn_setting_global": "Notifica di level-up globale.",
"xpn_setting_server": "Notifica di level-up del server.", "xpn_setting_server": "Notifica di level-up del server.",

View File

@ -720,16 +720,16 @@
"waifu_gift": "", "waifu_gift": "",
"waifu_gift_shop": "", "waifu_gift_shop": "",
"gifts": "", "gifts": "",
"nunchi_joined": "", "countup_joined": "",
"nunchi_ended": "", "countup_ended": "",
"nunchi_ended_no_winner": "", "countup_ended_no_winner": "",
"nunchi_started": "", "countup_started": "",
"nunchi_round_ended": "", "countup_round_ended": "",
"nunchi_round_ended_boot": "", "countup_round_ended_boot": "",
"nunchi_round_started": "", "countup_round_started": "",
"nunchi_next_number": "", "countup_next_number": "",
"nunchi_failed_to_start": "", "countup_failed_to_start": "",
"nunchi_created": "", "countup_created": "",
"sad_enabled": "再生が終わると曲はキューから削除されます。", "sad_enabled": "再生が終わると曲はキューから削除されます。",
"sad_disabled": "再生が終わっても曲はキューから削除されません。", "sad_disabled": "再生が終わっても曲はキューから削除されません。",
"stream_role_enabled": "", "stream_role_enabled": "",

View File

@ -720,16 +720,16 @@
"waifu_gift": "{1}에게 {0}개를 선물하셨습니다", "waifu_gift": "{1}에게 {0}개를 선물하셨습니다",
"waifu_gift_shop": "와이프 선물 가게", "waifu_gift_shop": "와이프 선물 가게",
"gifts": "선물", "gifts": "선물",
"nunchi_joined": "눈치 게임에 참가했습니다. {0} 명의 사용자가 지금까지 참가했습니다.", "countup_joined": "눈치 게임에 참가했습니다. {0} 명의 사용자가 지금까지 참가했습니다.",
"nunchi_ended": "눈치 게임이 종료되었습니다. {0}님이 이겼습니다", "countup_ended": "눈치 게임이 종료되었습니다. {0}님이 이겼습니다",
"nunchi_ended_no_winner": "눈치 게임이 승자없이 종료되었습니다.", "countup_ended_no_winner": "눈치 게임이 승자없이 종료되었습니다.",
"nunchi_started": "{0}명의 참가자와 함께 눈치 게임을 시작했습니다.", "countup_started": "{0}명의 참가자와 함께 눈치 게임을 시작했습니다.",
"nunchi_round_ended": "눈치 게임 라운드가 종료되었습니다. {0}님이 탈락했습니다.", "countup_round_ended": "눈치 게임 라운드가 종료되었습니다. {0}님이 탈락했습니다.",
"nunchi_round_ended_boot": "눈치 게임 라운드는 일부 사용자의 시간 초과로 종료되었습니다. 이 사용자는 여전히 게임 중입니다: {0}", "countup_round_ended_boot": "눈치 게임 라운드는 일부 사용자의 시간 초과로 종료되었습니다. 이 사용자는 여전히 게임 중입니다: {0}",
"nunchi_round_started": "{0}명의 참가자와 함께 눈치 게임 라운드가 시작되었습니다. 숫자 {1}부터 시작합니다.", "countup_round_started": "{0}명의 참가자와 함께 눈치 게임 라운드가 시작되었습니다. 숫자 {1}부터 시작합니다.",
"nunchi_next_number": "숫자가 등록되었습니다. 마지막 숫자는 {0} 입니다.", "countup_next_number": "숫자가 등록되었습니다. 마지막 숫자는 {0} 입니다.",
"nunchi_failed_to_start": "충분한 플레이어가 없어서 눈치게임 시작에 실패했습니다.", "countup_failed_to_start": "충분한 플레이어가 없어서 눈치게임 시작에 실패했습니다.",
"nunchi_created": "눈치게임이 생성되었습니다. 플레이어의 참여를 기다리는 중입니다.", "countup_created": "눈치게임이 생성되었습니다. 플레이어의 참여를 기다리는 중입니다.",
"sad_enabled": "음악 재생이 완료되면 대기열에서 삭제됩니다.", "sad_enabled": "음악 재생이 완료되면 대기열에서 삭제됩니다.",
"sad_disabled": "음악 재생이 완료되면 때 더 이상 대기열에서 삭제되지 않을 것입니다.", "sad_disabled": "음악 재생이 완료되면 때 더 이상 대기열에서 삭제되지 않을 것입니다.",
"stream_role_enabled": "{0} 역할을 가진 사용자가 스트리밍을 시작하면 {1} 역할을 부여하겠습니다", "stream_role_enabled": "{0} 역할을 가진 사용자가 스트리밍을 시작하면 {1} 역할을 부여하겠습니다",

View File

@ -720,16 +720,16 @@
"waifu_gift": "Ga {0} til {1].", "waifu_gift": "Ga {0} til {1].",
"waifu_gift_shop": "Waifu gavebutikk.", "waifu_gift_shop": "Waifu gavebutikk.",
"gifts": "Gaver.", "gifts": "Gaver.",
"nunchi_joined": "Startet \u0027nunchi\u0027. {0} spillere har blitt med.", "countup_joined": "Startet \u0027nunchi\u0027. {0} spillere har blitt med.",
"nunchi_ended": "Nunchi avsluttet. {0} vant.", "countup_ended": "Nunchi avsluttet. {0} vant.",
"nunchi_ended_no_winner": "Nunchi avsluttet uten en vinner.", "countup_ended_no_winner": "Nunchi avsluttet uten en vinner.",
"nunchi_started": "Nunchi startet med {0} deltakere.", "countup_started": "Nunchi startet med {0} deltakere.",
"nunchi_round_ended": "Nunchi runde avsluttet. {0} er ute av spillet.", "countup_round_ended": "Nunchi runde avsluttet. {0} er ute av spillet.",
"nunchi_round_ended_boot": "Nunchi runded avsluttet fordi én eller flere spillere ikke reagerte i tide. Disse er fremdeles med i spillet: {0}", "countup_round_ended_boot": "Nunchi runded avsluttet fordi én eller flere spillere ikke reagerte i tide. Disse er fremdeles med i spillet: {0}",
"nunchi_round_started": "Nunchi startet med {0} spillere. Start med å telle fra {1}", "countup_round_started": "Nunchi startet med {0} spillere. Start med å telle fra {1}",
"nunchi_next_number": "Tall registrert. Siste nummer var {0}.", "countup_next_number": "Tall registrert. Siste nummer var {0}.",
"nunchi_failed_to_start": "Nunchi kunne ikke starte fordi det ikke var nok deltakere.", "countup_failed_to_start": "Nunchi kunne ikke starte fordi det ikke var nok deltakere.",
"nunchi_created": "Nunchi startet. Venter på spillere.", "countup_created": "Nunchi startet. Venter på spillere.",
"sad_enabled": "Sanger vil bli fjernet fra lista når de er spilt av.", "sad_enabled": "Sanger vil bli fjernet fra lista når de er spilt av.",
"sad_disabled": "Sanger blir ikke lenger fjernet fra lista når de er spilt av.", "sad_disabled": "Sanger blir ikke lenger fjernet fra lista når de er spilt av.",
"stream_role_enabled": "Når en bruker med rollen {0} strømmer, får de rollen {1}.", "stream_role_enabled": "Når en bruker med rollen {0} strømmer, får de rollen {1}.",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "Connect4-spel kon niet starten omdat niemand joinde.", "connect4_failed_to_start": "Connect4-spel kon niet starten omdat niemand joinde.",
"connect4_draw": "Connect4-spel eindigde in gelijkspel.", "connect4_draw": "Connect4-spel eindigde in gelijkspel.",
"connect4_won": "{0} wint het Connect4-spel van {1}.", "connect4_won": "{0} wint het Connect4-spel van {1}.",
"nunchi_joined": "Nunchi-spel gejoind. Tot nu toe zijn {0} users gejoind.", "countup_joined": "Nunchi-spel gejoind. Tot nu toe zijn {0} users gejoind.",
"nunchi_ended": "Nunchi-spel afgelopen. {0} heeft gewonnen.", "countup_ended": "Nunchi-spel afgelopen. {0} heeft gewonnen.",
"nunchi_ended_no_winner": "Nunchi-spel eindigde zonder winnaar.", "countup_ended_no_winner": "Nunchi-spel eindigde zonder winnaar.",
"nunchi_round_ended": "Nunchi-ronde is afgelopen. {0} verlaat het spel.", "countup_round_ended": "Nunchi-ronde is afgelopen. {0} verlaat het spel.",
"nunchi_round_ended_boot": "Nunchi-ronde afgelopen vanwege timeout van sommige spelers. Deze spelers zijn nog in ger spel: {0}", "countup_round_ended_boot": "Nunchi-ronde afgelopen vanwege timeout van sommige spelers. Deze spelers zijn nog in ger spel: {0}",
"nunchi_round_started": "Nunchi-ronde is gestart met {0} users. Start het tellen vanaf {1}.", "countup_round_started": "Nunchi-ronde is gestart met {0} users. Start het tellen vanaf {1}.",
"nunchi_next_number": "Getal vastgelegd. Vorig getal was {0}.", "countup_next_number": "Getal vastgelegd. Vorig getal was {0}.",
"nunchi_failed_to_start": "Nunchi-spel starten mislukt omdat er niet genoeg deelnemers zijn.", "countup_failed_to_start": "Nunchi-spel starten mislukt omdat er niet genoeg deelnemers zijn.",
"nunchi_created": "Nunchi-spel aangemaakt. Wacht op users die joinen.", "countup_created": "Nunchi-spel aangemaakt. Wacht op users die joinen.",
"stream_role_enabled": "Wanneer een user met de rol {0} begint te streamen, dan krijgt hij de rol {1}.", "stream_role_enabled": "Wanneer een user met de rol {0} begint te streamen, dan krijgt hij de rol {1}.",
"stream_role_disabled": "Functie stream-rollen is uitgeschakeld.", "stream_role_disabled": "Functie stream-rollen is uitgeschakeld.",
"stream_role_kw_set": "Streamers hebben nu het sleutelwoord {0} nodig om de rol te krijgen.", "stream_role_kw_set": "Streamers hebben nu het sleutelwoord {0} nodig om de rol te krijgen.",
@ -791,7 +791,7 @@
"perm_override": "Gebruikers hebben {0} toestemming nodig om {1} commando uit te voeren.", "perm_override": "Gebruikers hebben {0} toestemming nodig om {1} commando uit te voeren.",
"define_unknown": "Ik kan de definitie van die term niet vinden.", "define_unknown": "Ik kan de definitie van die term niet vinden.",
"queue_stopped": "Speler is gestopt. Gebruik het {0} commando om het afspelen te starten.", "queue_stopped": "Speler is gestopt. Gebruik het {0} commando om het afspelen te starten.",
"nunchi_started": "Nunchi spel begon met {0} deelnemers.", "countup_started": "Nunchi spel begon met {0} deelnemers.",
"bot_strings_reloaded": "Bot strings zijn herladen.", "bot_strings_reloaded": "Bot strings zijn herladen.",
"xpn_setting_global": "Globale Level-Up meldingen", "xpn_setting_global": "Globale Level-Up meldingen",
"xpn_setting_server": "Server Level-Up meldingen", "xpn_setting_server": "Server Level-Up meldingen",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "Nie udało się rozpocząć gry w Cztery w rzędzie ponieważ nikt nie dołączył.", "connect4_failed_to_start": "Nie udało się rozpocząć gry w Cztery w rzędzie ponieważ nikt nie dołączył.",
"connect4_draw": "Gra w Cztery w rzędzie zakończyła się remisem.", "connect4_draw": "Gra w Cztery w rzędzie zakończyła się remisem.",
"connect4_won": "{0} wygrywa grę w Cztery w rzędzie przeciwko {1}.", "connect4_won": "{0} wygrywa grę w Cztery w rzędzie przeciwko {1}.",
"nunchi_joined": "Dołączono do gry w nunchi. Do tej pory dołączyło {0}.", "countup_joined": "Dołączono do gry w nunchi. Do tej pory dołączyło {0}.",
"nunchi_ended": "Gra w nunchi zakończona. Wygrywa {0}", "countup_ended": "Gra w nunchi zakończona. Wygrywa {0}",
"nunchi_ended_no_winner": "Gra w nunchi zakończona bez wyłaniania zwycięzcy.", "countup_ended_no_winner": "Gra w nunchi zakończona bez wyłaniania zwycięzcy.",
"nunchi_round_ended": "Runda nunchi za nami. {0} wypada z gry.", "countup_round_ended": "Runda nunchi za nami. {0} wypada z gry.",
"nunchi_round_ended_boot": "Runda nunchi zakończona z powodu braku aktywności niektórych użytkowników. W grze pozostają: {0}", "countup_round_ended_boot": "Runda nunchi zakończona z powodu braku aktywności niektórych użytkowników. W grze pozostają: {0}",
"nunchi_round_started": "Runda nunchi rozpoczęta z {0} użytkownikami. Zacznijcie liczyć od {1}.", "countup_round_started": "Runda nunchi rozpoczęta z {0} użytkownikami. Zacznijcie liczyć od {1}.",
"nunchi_next_number": "Numer zapisany. Ostatnia liczba to {0}.", "countup_next_number": "Numer zapisany. Ostatnia liczba to {0}.",
"nunchi_failed_to_start": "Nie udało się uruchomić nunchi z powodu braku wystarczającej ilości graczy.", "countup_failed_to_start": "Nie udało się uruchomić nunchi z powodu braku wystarczającej ilości graczy.",
"nunchi_created": "Gra w nunchi utworzona. Oczekiwanie na dołączenie graczy.", "countup_created": "Gra w nunchi utworzona. Oczekiwanie na dołączenie graczy.",
"stream_role_enabled": "Kiedy użytkownik z roli {0} zacznie streamować, nadam mu rolę {1}.", "stream_role_enabled": "Kiedy użytkownik z roli {0} zacznie streamować, nadam mu rolę {1}.",
"stream_role_disabled": "Funkcja rola streamowania została wyłączona.", "stream_role_disabled": "Funkcja rola streamowania została wyłączona.",
"stream_role_kw_set": "Żeby otrzymać rolę, streamerzy muszą użyć słowa kluczowego {0}.", "stream_role_kw_set": "Żeby otrzymać rolę, streamerzy muszą użyć słowa kluczowego {0}.",
@ -791,7 +791,7 @@
"perm_override": "Użytkownicy będą musieli posiadać uprawnienie {0} żeby użyć komendy {1}.", "perm_override": "Użytkownicy będą musieli posiadać uprawnienie {0} żeby użyć komendy {1}.",
"define_unknown": "Nie mogę znaleźć definicji tego terminu.", "define_unknown": "Nie mogę znaleźć definicji tego terminu.",
"queue_stopped": "Odtwarzacz jest zatrzymany. Użyj komendy {0} żeby rozpocząć odtwarzanie.", "queue_stopped": "Odtwarzacz jest zatrzymany. Użyj komendy {0} żeby rozpocząć odtwarzanie.",
"nunchi_started": "Gra nunchi rozpoczęta z {0} zawodników.", "countup_started": "Gra nunchi rozpoczęta z {0} zawodników.",
"bot_strings_reloaded": "Ciągi bota zostały przeładowane.", "bot_strings_reloaded": "Ciągi bota zostały przeładowane.",
"xpn_setting_global": "Globalne powiadomienia o Awansach Poziomów", "xpn_setting_global": "Globalne powiadomienia o Awansach Poziomów",
"xpn_setting_server": "Serwerowe powiadomienia o Awansach Poziomów", "xpn_setting_server": "Serwerowe powiadomienia o Awansach Poziomów",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "A partida de Connect4 não iniciou porque ninguém entrou.", "connect4_failed_to_start": "A partida de Connect4 não iniciou porque ninguém entrou.",
"connect4_draw": "A partida de Connect4 terminou em empate.", "connect4_draw": "A partida de Connect4 terminou em empate.",
"connect4_won": "{0} venceu a partida de Connect4 contra {1}.", "connect4_won": "{0} venceu a partida de Connect4 contra {1}.",
"nunchi_joined": "juntou-se à partida de Nunchi. {0} usuários já entraram.", "countup_joined": "juntou-se à partida de Nunchi. {0} usuários já entraram.",
"nunchi_ended": "A partida de Nunchi terminou. {0} é o vencedor!", "countup_ended": "A partida de Nunchi terminou. {0} é o vencedor!",
"nunchi_ended_no_winner": "A partida de Nunchi terminou sem vencedor.", "countup_ended_no_winner": "A partida de Nunchi terminou sem vencedor.",
"nunchi_round_ended": "Rodada de Nunchi encerrada. {0} foi eliminado.", "countup_round_ended": "Rodada de Nunchi encerrada. {0} foi eliminado.",
"nunchi_round_ended_boot": "A rodada de Nunchi foi encerrada devido à inatividade de alguns jogadores. Os seguintes jogadores permanecem no jogo: {0}", "countup_round_ended_boot": "A rodada de Nunchi foi encerrada devido à inatividade de alguns jogadores. Os seguintes jogadores permanecem no jogo: {0}",
"nunchi_round_started": "Rodada de Nunchi iniciada com {0} usuários. Comece a contar a partir do número {1}.", "countup_round_started": "Rodada de Nunchi iniciada com {0} usuários. Comece a contar a partir do número {1}.",
"nunchi_next_number": "Número registrado. O último número foi {0}.", "countup_next_number": "Número registrado. O último número foi {0}.",
"nunchi_failed_to_start": "A partida de Nunchi não iniciou porque não havia participantes o suficiente.", "countup_failed_to_start": "A partida de Nunchi não iniciou porque não havia participantes o suficiente.",
"nunchi_created": "Uma partida de Nunchi foi criada. Aguardando novos jogadores.", "countup_created": "Uma partida de Nunchi foi criada. Aguardando novos jogadores.",
"stream_role_enabled": "O cargo {1} será atribuído ao usuário do cargo {0} que iniciar um streaming.", "stream_role_enabled": "O cargo {1} será atribuído ao usuário do cargo {0} que iniciar um streaming.",
"stream_role_disabled": "O cargo de streaming foi desativado.", "stream_role_disabled": "O cargo de streaming foi desativado.",
"stream_role_kw_set": "Streamers precisarão da palavra-chave {0} no título do stream para receber o cargo.", "stream_role_kw_set": "Streamers precisarão da palavra-chave {0} no título do stream para receber o cargo.",
@ -791,7 +791,7 @@
"perm_override": "Os usuários precisão ter a permissão {0} para usar o comando {1}.", "perm_override": "Os usuários precisão ter a permissão {0} para usar o comando {1}.",
"define_unknown": "Não pude encontrar uma definição para esse termo.", "define_unknown": "Não pude encontrar uma definição para esse termo.",
"queue_stopped": "Player foi pausado. Use o comando {0} para começar a tocar.", "queue_stopped": "Player foi pausado. Use o comando {0} para começar a tocar.",
"nunchi_started": "O Nunchi começou com {0} participantes.", "countup_started": "O Nunchi começou com {0} participantes.",
"bot_strings_reloaded": "As strings do bot foram recarregadas.", "bot_strings_reloaded": "As strings do bot foram recarregadas.",
"xpn_setting_global": "Notificações de nível global", "xpn_setting_global": "Notificações de nível global",
"xpn_setting_server": "Notificações de nível do servidor", "xpn_setting_server": "Notificações de nível do servidor",

View File

@ -720,16 +720,16 @@
"waifu_gift": "Dăruit {0} lui {1}", "waifu_gift": "Dăruit {0} lui {1}",
"waifu_gift_shop": "Magazin de cadouri pentru waifu", "waifu_gift_shop": "Magazin de cadouri pentru waifu",
"gifts": "Cadouri", "gifts": "Cadouri",
"nunchi_joined": "Alăturat jocului de nunchi. {0} utilizatori s-au alăturat până acum.", "countup_joined": "Alăturat jocului de nunchi. {0} utilizatori s-au alăturat până acum.",
"nunchi_ended": "Jocul de nunchi s-a terminat. {0} a câștigat.", "countup_ended": "Jocul de nunchi s-a terminat. {0} a câștigat.",
"nunchi_ended_no_winner": "Jocul de nunchi s-a terminat fără vreun câștigător.", "countup_ended_no_winner": "Jocul de nunchi s-a terminat fără vreun câștigător.",
"nunchi_started": "Jocul de nunchi a început cu {0} participanți.", "countup_started": "Jocul de nunchi a început cu {0} participanți.",
"nunchi_round_ended": "Runda Nunchi s-a incheiat. {0} a fost eliminat.", "countup_round_ended": "Runda Nunchi s-a incheiat. {0} a fost eliminat.",
"nunchi_round_ended_boot": "Runda de Nunchi terminată din cauza trecerii unor utilizatori peste timpul permis. Acești utilizatori incă sunt în joc: {0}", "countup_round_ended_boot": "Runda de Nunchi terminată din cauza trecerii unor utilizatori peste timpul permis. Acești utilizatori incă sunt în joc: {0}",
"nunchi_round_started": "Runda Nunchi a început cu {0} jucatori. Începeți numărătoarea de la numarul {1}", "countup_round_started": "Runda Nunchi a început cu {0} jucatori. Începeți numărătoarea de la numarul {1}",
"nunchi_next_number": "Numar înregistrat. Ultimul număr a fost {0}.", "countup_next_number": "Numar înregistrat. Ultimul număr a fost {0}.",
"nunchi_failed_to_start": "Runda de Nunchi nu a început pentru că nu au fost destui participanți.", "countup_failed_to_start": "Runda de Nunchi nu a început pentru că nu au fost destui participanți.",
"nunchi_created": "Jocul de Nunchi a fost creat. Așteptăm ca jucătorii să intre.", "countup_created": "Jocul de Nunchi a fost creat. Așteptăm ca jucătorii să intre.",
"sad_enabled": "Melodiile vor fi șterse din listă atunci când se termină.", "sad_enabled": "Melodiile vor fi șterse din listă atunci când se termină.",
"sad_disabled": "Melodiile nu vor mai fi șterse din listă atunci când se vor termina.", "sad_disabled": "Melodiile nu vor mai fi șterse din listă atunci când se vor termina.",
"stream_role_enabled": "Când un utilizator din rolul {0} transmite un flux live, îi voi da rolul {1}.", "stream_role_enabled": "Când un utilizator din rolul {0} transmite un flux live, îi voi da rolul {1}.",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "Невозможно было начать игру в Connect4, поскольку никто не присоединился.", "connect4_failed_to_start": "Невозможно было начать игру в Connect4, поскольку никто не присоединился.",
"connect4_draw": "Игра в Connect4 закончилась ничьей.", "connect4_draw": "Игра в Connect4 закончилась ничьей.",
"connect4_won": "{0} победил игру в Connect4 против {1}.", "connect4_won": "{0} победил игру в Connect4 против {1}.",
"nunchi_joined": "Присоединился к игре в нунчи. Пока что присоединилось только {0} пользователей.", "countup_joined": "Присоединился к игре в нунчи. Пока что присоединилось только {0} пользователей.",
"nunchi_ended": "Игра в нунчи закончилась. {0} победил", "countup_ended": "Игра в нунчи закончилась. {0} победил",
"nunchi_ended_no_winner": "Игра в нунчи закончилась без победителя.", "countup_ended_no_winner": "Игра в нунчи закончилась без победителя.",
"nunchi_round_ended": "Раунд в нунчи окончен. {0} выбывает.", "countup_round_ended": "Раунд в нунчи окончен. {0} выбывает.",
"nunchi_round_ended_boot": "Раунд в нунчи закончился из-за таймаута некоторых пользователей. Данные пользователи ещё в игре: {0}", "countup_round_ended_boot": "Раунд в нунчи закончился из-за таймаута некоторых пользователей. Данные пользователи ещё в игре: {0}",
"nunchi_round_started": "Раунд в нунчи начался с {0} пользователями. Начните считать с числа {1}.", "countup_round_started": "Раунд в нунчи начался с {0} пользователями. Начните считать с числа {1}.",
"nunchi_next_number": "Номер зарегистрирован. Последний номер был {0}", "countup_next_number": "Номер зарегистрирован. Последний номер был {0}",
"nunchi_failed_to_start": "Невозможно было начать игру в нунчи из-за недостаточного количества участников.", "countup_failed_to_start": "Невозможно было начать игру в нунчи из-за недостаточного количества участников.",
"nunchi_created": "Игра в нунчи была создана. Ожидаются игроки.", "countup_created": "Игра в нунчи была создана. Ожидаются игроки.",
"stream_role_enabled": "Когда пользователи с ролью {0} запустят стрим, я добавлю им роль {1}.", "stream_role_enabled": "Когда пользователи с ролью {0} запустят стрим, я добавлю им роль {1}.",
"stream_role_disabled": "Функция стримерской роли была отключена.", "stream_role_disabled": "Функция стримерской роли была отключена.",
"stream_role_kw_set": "Стримерам теперь нужно ключевое слово {0}, что бы получить роль.", "stream_role_kw_set": "Стримерам теперь нужно ключевое слово {0}, что бы получить роль.",
@ -791,7 +791,7 @@
"perm_override": "Для запуска команды {1} пользователям потребуется разрешение {0}.", "perm_override": "Для запуска команды {1} пользователям потребуется разрешение {0}.",
"define_unknown": "Не могу найти определение для этого термина.", "define_unknown": "Не могу найти определение для этого термина.",
"queue_stopped": "Плеер остановлен. Используйте команду {0}, чтобы начать играть.", "queue_stopped": "Плеер остановлен. Используйте команду {0}, чтобы начать играть.",
"nunchi_started": "Игра «Нунчи» началась с {0} участниками.", "countup_started": "Игра «Нунчи» началась с {0} участниками.",
"bot_strings_reloaded": "Строки бота были перезагружены.", "bot_strings_reloaded": "Строки бота были перезагружены.",
"xpn_setting_global": "Уведомления о глобальном повышении уровня", "xpn_setting_global": "Уведомления о глобальном повышении уровня",
"xpn_setting_server": "Уведомления о повышении уровня на сервере", "xpn_setting_server": "Уведомления о повышении уровня на сервере",

View File

@ -720,16 +720,16 @@
"waifu_gift": "", "waifu_gift": "",
"waifu_gift_shop": "", "waifu_gift_shop": "",
"gifts": "", "gifts": "",
"nunchi_joined": "", "countup_joined": "",
"nunchi_ended": "", "countup_ended": "",
"nunchi_ended_no_winner": "", "countup_ended_no_winner": "",
"nunchi_started": "", "countup_started": "",
"nunchi_round_ended": "", "countup_round_ended": "",
"nunchi_round_ended_boot": "", "countup_round_ended_boot": "",
"nunchi_round_started": "", "countup_round_started": "",
"nunchi_next_number": "", "countup_next_number": "",
"nunchi_failed_to_start": "", "countup_failed_to_start": "",
"nunchi_created": "", "countup_created": "",
"sad_enabled": "", "sad_enabled": "",
"sad_disabled": "", "sad_disabled": "",
"stream_role_enabled": "", "stream_role_enabled": "",

View File

@ -720,16 +720,16 @@
"waifu_gift": "Gav {0} till {1}", "waifu_gift": "Gav {0} till {1}",
"waifu_gift_shop": "Waifu present shop", "waifu_gift_shop": "Waifu present shop",
"gifts": "Presenter", "gifts": "Presenter",
"nunchi_joined": "Anslöt till Nunchi. {0} spelare har anslutit hittills ", "countup_joined": "Anslöt till Nunchi. {0} spelare har anslutit hittills ",
"nunchi_ended": "Nunchi avslutat. {0} vann", "countup_ended": "Nunchi avslutat. {0} vann",
"nunchi_ended_no_winner": "Nunchi avslutat utan någon vinnare", "countup_ended_no_winner": "Nunchi avslutat utan någon vinnare",
"nunchi_started": "Nunchi har startat med {0} deltagare", "countup_started": "Nunchi har startat med {0} deltagare",
"nunchi_round_ended": "Nunchi runda avslutad. {0} är ute ur spelet", "countup_round_ended": "Nunchi runda avslutad. {0} är ute ur spelet",
"nunchi_round_ended_boot": "Nunchi rundan avslutad på grund av att vissa användare använt för mycket tid. Dessa användare är fortfarande med i spelet: {0}", "countup_round_ended_boot": "Nunchi rundan avslutad på grund av att vissa användare använt för mycket tid. Dessa användare är fortfarande med i spelet: {0}",
"nunchi_round_started": "Nunchi runda startade med {0} deltagare. Börja räkna från nummer {1}.", "countup_round_started": "Nunchi runda startade med {0} deltagare. Börja räkna från nummer {1}.",
"nunchi_next_number": "Nummer registrerat. Senaste numret var {0}", "countup_next_number": "Nummer registrerat. Senaste numret var {0}",
"nunchi_failed_to_start": "Nunchi startas inte eftersom det inte fanns tillräckligt många deltagare", "countup_failed_to_start": "Nunchi startas inte eftersom det inte fanns tillräckligt många deltagare",
"nunchi_created": "Nunchi skapat. Väntar på att deltagare ska ansluta", "countup_created": "Nunchi skapat. Väntar på att deltagare ska ansluta",
"sad_enabled": "Låtar tas bort ur kön när dom har spelats klart.", "sad_enabled": "Låtar tas bort ur kön när dom har spelats klart.",
"sad_disabled": "Låtar kommer inte längre tas bort från kön när dom spelats klart.", "sad_disabled": "Låtar kommer inte längre tas bort från kön när dom spelats klart.",
"stream_role_enabled": "När en användare från {0} rollen börjar strömma, kommer jag att ge dom {1} rollen.", "stream_role_enabled": "När en användare från {0} rollen börjar strömma, kommer jag att ge dom {1} rollen.",

View File

@ -720,16 +720,16 @@
"waifu_gift": "{0} {1}\u0027den daha yetenekli", "waifu_gift": "{0} {1}\u0027den daha yetenekli",
"waifu_gift_shop": "Waifu hediye dükkanı", "waifu_gift_shop": "Waifu hediye dükkanı",
"gifts": "Hediyeler", "gifts": "Hediyeler",
"nunchi_joined": "Nunchi oyununa katıldın. şimdiye kadar {0} kullanıcı katıldı.", "countup_joined": "Nunchi oyununa katıldın. şimdiye kadar {0} kullanıcı katıldı.",
"nunchi_ended": "Nunchi oyunu sona erdi. {0} kazandı", "countup_ended": "Nunchi oyunu sona erdi. {0} kazandı",
"nunchi_ended_no_winner": "Nunchi oyunu kazanan olmaksızın bitti.", "countup_ended_no_winner": "Nunchi oyunu kazanan olmaksızın bitti.",
"nunchi_started": "Nunchi oyunu {0} katılımcılarla başladı.", "countup_started": "Nunchi oyunu {0} katılımcılarla başladı.",
"nunchi_round_ended": "Nunchi turu sona erdi. {0} oyun dışı.", "countup_round_ended": "Nunchi turu sona erdi. {0} oyun dışı.",
"nunchi_round_ended_boot": "Bazı kullanıcıların zaman aşımı nedeniyle Nunchi turu sona erdi. Bu kadar kullanıcı hala oyunda: {0}", "countup_round_ended_boot": "Bazı kullanıcıların zaman aşımı nedeniyle Nunchi turu sona erdi. Bu kadar kullanıcı hala oyunda: {0}",
"nunchi_round_started": "Nunchi turu {0} kullanıcılarıyla başladı. {1} numarasından saymaya başlayın.", "countup_round_started": "Nunchi turu {0} kullanıcılarıyla başladı. {1} numarasından saymaya başlayın.",
"nunchi_next_number": "Numara kaydedildi. Son sayı {0} idi.", "countup_next_number": "Numara kaydedildi. Son sayı {0} idi.",
"nunchi_failed_to_start": "Nunchi başlayamadı, çünkü yeterli katılımcı yoktu.", "countup_failed_to_start": "Nunchi başlayamadı, çünkü yeterli katılımcı yoktu.",
"nunchi_created": "Nunchi oyunu kuruldu. Kullanıcıların katılmasını bekliyorum.", "countup_created": "Nunchi oyunu kuruldu. Kullanıcıların katılmasını bekliyorum.",
"sad_enabled": "Şarkılar, çalmayı bitirince müzik kuyruğundan silinir.", "sad_enabled": "Şarkılar, çalmayı bitirince müzik kuyruğundan silinir.",
"sad_disabled": "Şarkılar, çalmayı bitirdiğinde artık müzik kuyruğundan silinmeyecek.", "sad_disabled": "Şarkılar, çalmayı bitirdiğinde artık müzik kuyruğundan silinmeyecek.",
"stream_role_enabled": "{0} rolündeki bir kullanıcı yayın başlattığında, onlara {1} rol vereceğim.", "stream_role_enabled": "{0} rolündeki bir kullanıcı yayın başlattığında, onlara {1} rol vereceğim.",

View File

@ -720,16 +720,16 @@
"waifu_gift": "Threw {0} to {1} with success. It hit them on the head and they are in hospital now.", "waifu_gift": "Threw {0} to {1} with success. It hit them on the head and they are in hospital now.",
"waifu_gift_shop": "Digital waifu pillow weebshop. You better buy me something too.", "waifu_gift_shop": "Digital waifu pillow weebshop. You better buy me something too.",
"gifts": "Presents from Peasants. I\u0027ll throw them right back at you, if I don\u0027t like them.", "gifts": "Presents from Peasants. I\u0027ll throw them right back at you, if I don\u0027t like them.",
"nunchi_joined": "You joined the nunchi game. {0} other users want to play so far, all because of me. Thank me. Now.", "countup_joined": "You joined the nunchi game. {0} other users want to play so far, all because of me. Thank me. Now.",
"nunchi_ended": "Nunchi game ended. {0} won, cus they are clearly better than you.", "countup_ended": "Nunchi game ended. {0} won, cus they are clearly better than you.",
"nunchi_ended_no_winner": "The game ended and none of you were good enough to win. What a surprise.", "countup_ended_no_winner": "The game ended and none of you were good enough to win. What a surprise.",
"nunchi_started": "The nunchi game has started with {0} participants! We all know i\u0027m going to win. Why even try?", "countup_started": "The nunchi game has started with {0} participants! We all know i\u0027m going to win. Why even try?",
"nunchi_round_ended": "Nunchi round has ended! {0} is out of the game, now leave the server while you\u0027re at it, BAKA.", "countup_round_ended": "Nunchi round has ended! {0} is out of the game, now leave the server while you\u0027re at it, BAKA.",
"nunchi_round_ended_boot": "Nunchi round ended due to timeout of some lazy users. These active users are still in the game: {0}", "countup_round_ended_boot": "Nunchi round ended due to timeout of some lazy users. These active users are still in the game: {0}",
"nunchi_round_started": "The nunchi round has started with {0} users! Start counting from the number {1}. I suggest not being stupid but i know that\u0027s gonna be hard for you :D", "countup_round_started": "The nunchi round has started with {0} users! Start counting from the number {1}. I suggest not being stupid but i know that\u0027s gonna be hard for you :D",
"nunchi_next_number": "Number registered. Last number was {0}. SIGH.", "countup_next_number": "Number registered. Last number was {0}. SIGH.",
"nunchi_failed_to_start": "Not enough people joined the nunchi game because they saw you enter it. Now the game failed to start. Good job BAKA.", "countup_failed_to_start": "Not enough people joined the nunchi game because they saw you enter it. Now the game failed to start. Good job BAKA.",
"nunchi_created": "I\u0027ve created a Nunchi game... b-but DEFINITELY NOT for you BAKA! It\u0027s for the others that will join now!", "countup_created": "I\u0027ve created a Nunchi game... b-but DEFINITELY NOT for you BAKA! It\u0027s for the others that will join now!",
"sad_enabled": "Great! My ears hurt now! I\u0027m deleting those songs when it\u0027s over.", "sad_enabled": "Great! My ears hurt now! I\u0027m deleting those songs when it\u0027s over.",
"sad_disabled": "Your taste of songs are... fine I guess. I\u0027ll stop removing them from the queue. Just this time... tchhh..", "sad_disabled": "Your taste of songs are... fine I guess. I\u0027ll stop removing them from the queue. Just this time... tchhh..",
"stream_role_enabled": "When a user from {0} role starts streaming, I\u0027ll give them {1} role too! But only because they aren\u0027t as annoying as you.", "stream_role_enabled": "When a user from {0} role starts streaming, I\u0027ll give them {1} role too! But only because they aren\u0027t as annoying as you.",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "З'єднай4 не змогла запуститись, так як ніхто не приєднався.", "connect4_failed_to_start": "З'єднай4 не змогла запуститись, так як ніхто не приєднався.",
"connect4_draw": "З'єднай4 закінчилась нічиєю.", "connect4_draw": "З'єднай4 закінчилась нічиєю.",
"connect4_won": "{0} переміг в грі З'єднай4 проти {1}.", "connect4_won": "{0} переміг в грі З'єднай4 проти {1}.",
"nunchi_joined": "Приєднались до гри в нунчі. Очікуєм на {0} користувачів.", "countup_joined": "Приєднались до гри в нунчі. Очікуєм на {0} користувачів.",
"nunchi_ended": "Гра в нунчі закінчилась. Виграв {0}", "countup_ended": "Гра в нунчі закінчилась. Виграв {0}",
"nunchi_ended_no_winner": "Гра в нунчі закінчилась без переможців.", "countup_ended_no_winner": "Гра в нунчі закінчилась без переможців.",
"nunchi_round_ended": "Нунчі раунд закінчився. {0} вибув з гри.", "countup_round_ended": "Нунчі раунд закінчився. {0} вибув з гри.",
"nunchi_round_ended_boot": "Нунчі раунд закінчився через закінчення часу у деяких користувачів. Користувачі ще у грі: {0}", "countup_round_ended_boot": "Нунчі раунд закінчився через закінчення часу у деяких користувачів. Користувачі ще у грі: {0}",
"nunchi_round_started": "Нунчі раунд почався з {0} користувачами. Старт відрахунку почнеться з номера {1}.", "countup_round_started": "Нунчі раунд почався з {0} користувачами. Старт відрахунку почнеться з номера {1}.",
"nunchi_next_number": "Номер зареєстрований. Останій номер був {0}.", "countup_next_number": "Номер зареєстрований. Останій номер був {0}.",
"nunchi_failed_to_start": "Нунчі не може розпочатись так як не хватає учасників.", "countup_failed_to_start": "Нунчі не може розпочатись так як не хватає учасників.",
"nunchi_created": "Гра в нунчі створена. Очікуєм на гравців.", "countup_created": "Гра в нунчі створена. Очікуєм на гравців.",
"stream_role_enabled": "Коли користувач з ролью {0} починає стрім, Я видам йому {1} роль.", "stream_role_enabled": "Коли користувач з ролью {0} починає стрім, Я видам йому {1} роль.",
"stream_role_disabled": "Можливість ролі стрімера була вимкнена.", "stream_role_disabled": "Можливість ролі стрімера була вимкнена.",
"stream_role_kw_set": "Стрімер тепер потребує {0} ключові слова у порядку щоб получити роль.", "stream_role_kw_set": "Стрімер тепер потребує {0} ключові слова у порядку щоб получити роль.",
@ -791,7 +791,7 @@
"perm_override": "Для виконання команди {1} користувачам потрібен дозвіл {0}.", "perm_override": "Для виконання команди {1} користувачам потрібен дозвіл {0}.",
"define_unknown": "Не можу знайти визначення цього терміну.", "define_unknown": "Не можу знайти визначення цього терміну.",
"queue_stopped": "Плеєр зупинено. Використовуйте команду {0}, щоб почати відтворення.", "queue_stopped": "Плеєр зупинено. Використовуйте команду {0}, щоб почати відтворення.",
"nunchi_started": "Гра Нунчі розпочалася з {0} учасниками.", "countup_started": "Гра Нунчі розпочалася з {0} учасниками.",
"bot_strings_reloaded": "Строки ботів були перезавантажені.", "bot_strings_reloaded": "Строки ботів були перезавантажені.",
"xpn_setting_global": "Глобальне сповіщення про підняття рівню", "xpn_setting_global": "Глобальне сповіщення про підняття рівню",
"xpn_setting_server": "Серверне сповіщення про підняття рівню", "xpn_setting_server": "Серверне сповіщення про підняття рівню",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "", "connect4_failed_to_start": "",
"connect4_draw": "", "connect4_draw": "",
"connect4_won": "", "connect4_won": "",
"nunchi_joined": "", "countup_joined": "",
"nunchi_ended": "", "countup_ended": "",
"nunchi_ended_no_winner": "", "countup_ended_no_winner": "",
"nunchi_round_ended": "", "countup_round_ended": "",
"nunchi_round_ended_boot": "", "countup_round_ended_boot": "",
"nunchi_round_started": "", "countup_round_started": "",
"nunchi_next_number": "", "countup_next_number": "",
"nunchi_failed_to_start": "", "countup_failed_to_start": "",
"nunchi_created": "", "countup_created": "",
"stream_role_enabled": "当来自 {0} 角色的用户开始流式传输时,我会给他们 {1} 角色.", "stream_role_enabled": "当来自 {0} 角色的用户开始流式传输时,我会给他们 {1} 角色.",
"stream_role_disabled": "流角色功能已被禁用.", "stream_role_disabled": "流角色功能已被禁用.",
"stream_role_kw_set": "", "stream_role_kw_set": "",
@ -791,7 +791,7 @@
"perm_override": "用户需要 {0} 权限才能运行 {1} 命令.", "perm_override": "用户需要 {0} 权限才能运行 {1} 命令.",
"define_unknown": "", "define_unknown": "",
"queue_stopped": "", "queue_stopped": "",
"nunchi_started": "", "countup_started": "",
"bot_strings_reloaded": "", "bot_strings_reloaded": "",
"xpn_setting_global": "", "xpn_setting_global": "",
"xpn_setting_server": "", "xpn_setting_server": "",

View File

@ -442,15 +442,15 @@
"connect4_failed_to_start": "由於沒有玩家參與,四子棋遊戲無法開始。", "connect4_failed_to_start": "由於沒有玩家參與,四子棋遊戲無法開始。",
"connect4_draw": "四子棋遊戲終止於平手。", "connect4_draw": "四子棋遊戲終止於平手。",
"connect4_won": "{0} 贏得了與 {1} 的 Connect4 比賽。", "connect4_won": "{0} 贏得了與 {1} 的 Connect4 比賽。",
"nunchi_joined": "加入了雙胞胎遊戲。目前有 {0} 位用戶加入。", "countup_joined": "加入了雙胞胎遊戲。目前有 {0} 位用戶加入。",
"nunchi_ended": "Nunchi遊戲結束。{0}贏了", "countup_ended": "Nunchi遊戲結束。{0}贏了",
"nunchi_ended_no_winner": "Nunchi 比賽沒有贏家而結束。", "countup_ended_no_winner": "Nunchi 比賽沒有贏家而結束。",
"nunchi_round_ended": "Nunchi回合結束。{0} 退出遊戲。", "countup_round_ended": "Nunchi回合結束。{0} 退出遊戲。",
"nunchi_round_ended_boot": "Nunchi 回合因部分用戶超時而結束。這些用戶仍在遊戲中:{0}", "countup_round_ended_boot": "Nunchi 回合因部分用戶超時而結束。這些用戶仍在遊戲中:{0}",
"nunchi_round_started": "Nunchi 回合從 {0} 名用戶開始。從數字 {1} 開始計數。", "countup_round_started": "Nunchi 回合從 {0} 名用戶開始。從數字 {1} 開始計數。",
"nunchi_next_number": "註冊的號碼。最後一個數字是 {0}。", "countup_next_number": "註冊的號碼。最後一個數字是 {0}。",
"nunchi_failed_to_start": "Nunchi 遊戲未能啟動,因為沒有足夠的參與者。", "countup_failed_to_start": "Nunchi 遊戲未能啟動,因為沒有足夠的參與者。",
"nunchi_created": "Nunchi 遊戲創建。等待用戶加入。", "countup_created": "Nunchi 遊戲創建。等待用戶加入。",
"stream_role_enabled": "當來自 {0} 身分組的用戶開始直播實況時,我會給他們 {1} 身分組。", "stream_role_enabled": "當來自 {0} 身分組的用戶開始直播實況時,我會給他們 {1} 身分組。",
"stream_role_disabled": "實況身分組功能已被禁用。", "stream_role_disabled": "實況身分組功能已被禁用。",
"stream_role_kw_set": "主播現在需要 {0} 關鍵字才能接收身分組。", "stream_role_kw_set": "主播現在需要 {0} 關鍵字才能接收身分組。",
@ -791,7 +791,7 @@
"perm_override": "用戶需要 {0} 權限才能運行 {1} 命令。", "perm_override": "用戶需要 {0} 權限才能運行 {1} 命令。",
"define_unknown": "找不到該術語的定義。", "define_unknown": "找不到該術語的定義。",
"queue_stopped": "播放器停止。使用 {0} 命令開始播放。", "queue_stopped": "播放器停止。使用 {0} 命令開始播放。",
"nunchi_started": "Nunchi 遊戲開始時有 {0} 名參與者。", "countup_started": "Nunchi 遊戲開始時有 {0} 名參與者。",
"bot_strings_reloaded": "機器人字串已重新加載。", "bot_strings_reloaded": "機器人字串已重新加載。",
"xpn_setting_global": "全球升級通知", "xpn_setting_global": "全球升級通知",
"xpn_setting_server": "伺服器升級通知", "xpn_setting_server": "伺服器升級通知",