diff --git a/CHANGELOG.md b/CHANGELOG.md index fa3907fa4..915334ce0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,10 +34,13 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog. - For self-hosters: - Added `.sqlselectcsv` which will return results in a csv file instead of an embed. - Added a page parameter to `.feedlist` +- Added seconds/sec/s to .convert command ### Changed - Users who have manage messages perm in the channel will now be excluded from link and invite filtering (`.sfi` and `.sfl`) +- `.send` command should work consistently and correctly now. You can have targets from other shards too. The usage has been changed. refer to `.h .send` for more info +- `.serverinfo` no longer takes a server name. It only takes an id or no arguments - You can now target a different channel with .repeat, for example `.repeat #some-other 1h Hello every hour` - `.cmds `, `.cmds Format.Code(i.ItemId.ToString()) + " " - + ((await _client.Rest.GetUserAsync(i.ItemId)) + + ((_client.GetUser(i.ItemId)) ?.ToString() ?? ""), BlacklistType.Server => Format.Code(i.ItemId.ToString()) diff --git a/src/NadekoBot/Modules/Utility/Info/InfoCommands.cs b/src/NadekoBot/Modules/Utility/Info/InfoCommands.cs index a7dcef1a0..67d2165be 100644 --- a/src/NadekoBot/Modules/Utility/Info/InfoCommands.cs +++ b/src/NadekoBot/Modules/Utility/Info/InfoCommands.cs @@ -22,31 +22,25 @@ public partial class Utility [Cmd] [OwnerOnly] - public Task ServerInfo([Leftover] string guildName) - => InternalServerInfo(guildName); + public Task ServerInfo(ulong guildId) + => InternalServerInfo(guildId); [Cmd] [RequireContext(ContextType.Guild)] public Task ServerInfo() - => InternalServerInfo(); + => InternalServerInfo(ctx.Guild.Id); - private async Task InternalServerInfo(string guildName = null) + private async Task InternalServerInfo(ulong guildId) { - var channel = (ITextChannel)ctx.Channel; - guildName = guildName?.ToUpperInvariant(); - SocketGuild guild; - - if (string.IsNullOrWhiteSpace(guildName)) - guild = (SocketGuild)channel.Guild; - else - guild = _client.Guilds.FirstOrDefault(g => g.Name.ToUpperInvariant() == guildName.ToUpperInvariant()); - + var guild = (IGuild)_client.GetGuild(guildId) + ?? await _client.Rest.GetGuildAsync(guildId); + if (guild is null) return; - var ownername = guild.GetUser(guild.OwnerId); - var textchn = guild.TextChannels.Count; - var voicechn = guild.VoiceChannels.Count; + var ownername = await guild.GetUserAsync(guild.OwnerId); + var textchn = (await guild.GetTextChannelsAsync()).Count; + var voicechn = (await guild.GetVoiceChannelsAsync()).Count; var channels = $@"{GetText(strs.text_channels(textchn))} {GetText(strs.voice_channels(voicechn))}"; var createdAt = new DateTime(2015, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(guild.Id >> 22); @@ -55,16 +49,16 @@ public partial class Utility features = "-"; var embed = _sender.CreateEmbed() - .WithAuthor(GetText(strs.server_info)) - .WithTitle(guild.Name) - .AddField(GetText(strs.id), guild.Id.ToString(), true) - .AddField(GetText(strs.owner), ownername.ToString(), true) - .AddField(GetText(strs.members), guild.MemberCount.ToString(), true) - .AddField(GetText(strs.channels), channels, true) - .AddField(GetText(strs.created_at), $"{createdAt:dd.MM.yyyy HH:mm}", true) - .AddField(GetText(strs.roles), (guild.Roles.Count - 1).ToString(), true) - .AddField(GetText(strs.features), features) - .WithOkColor(); + .WithAuthor(GetText(strs.server_info)) + .WithTitle(guild.Name) + .AddField(GetText(strs.id), guild.Id.ToString(), true) + .AddField(GetText(strs.owner), ownername.ToString(), true) + .AddField(GetText(strs.members), (guild as SocketGuild)?.MemberCount ?? guild.ApproximateMemberCount, true) + .AddField(GetText(strs.channels), channels, true) + .AddField(GetText(strs.created_at), $"{createdAt:dd.MM.yyyy HH:mm}", true) + .AddField(GetText(strs.roles), (guild.Roles.Count - 1).ToString(), true) + .AddField(GetText(strs.features), features) + .WithOkColor(); if (Uri.IsWellFormedUriString(guild.IconUrl, UriKind.Absolute)) embed.WithThumbnailUrl(guild.IconUrl); @@ -88,39 +82,41 @@ public partial class Utility var createdAt = new DateTime(2015, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(ch.Id >> 22); var usercount = (await ch.GetUsersAsync().FlattenAsync()).Count(); var embed = _sender.CreateEmbed() - .WithTitle(ch.Name) - .WithDescription(ch.Topic?.SanitizeMentions(true)) - .AddField(GetText(strs.id), ch.Id.ToString(), true) - .AddField(GetText(strs.created_at), $"{createdAt:dd.MM.yyyy HH:mm}", true) - .AddField(GetText(strs.users), usercount.ToString(), true) - .WithOkColor(); + .WithTitle(ch.Name) + .WithDescription(ch.Topic?.SanitizeMentions(true)) + .AddField(GetText(strs.id), ch.Id.ToString(), true) + .AddField(GetText(strs.created_at), $"{createdAt:dd.MM.yyyy HH:mm}", true) + .AddField(GetText(strs.users), usercount.ToString(), true) + .WithOkColor(); await Response().Embed(embed).SendAsync(); } - + [Cmd] [RequireUserPermission(GuildPermission.ManageRoles)] public async Task RoleInfo([Leftover] SocketRole role) { if (role.IsEveryone) return; - + var createdAt = new DateTime(2015, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc) .AddMilliseconds(role.Id >> 22); var usercount = role.Members.LongCount(); var embed = _sender.CreateEmbed() - .WithTitle(role.Name.TrimTo(128)) - .WithDescription(role.Permissions.ToList().Join(" | ")) - .AddField(GetText(strs.id), role.Id.ToString(), true) - .AddField(GetText(strs.created_at), $"{createdAt:dd.MM.yyyy HH:mm}", true) - .AddField(GetText(strs.users), usercount.ToString(), true) - .AddField(GetText(strs.color), $"#{role.Color.R:X2}{role.Color.G:X2}{role.Color.B:X2}", true) - .AddField(GetText(strs.mentionable), role.IsMentionable.ToString(), true) - .AddField(GetText(strs.hoisted), role.IsHoisted.ToString(), true) - .WithOkColor(); + .WithTitle(role.Name.TrimTo(128)) + .WithDescription(role.Permissions.ToList().Join(" | ")) + .AddField(GetText(strs.id), role.Id.ToString(), true) + .AddField(GetText(strs.created_at), $"{createdAt:dd.MM.yyyy HH:mm}", true) + .AddField(GetText(strs.users), usercount.ToString(), true) + .AddField(GetText(strs.color), + $"#{role.Color.R:X2}{role.Color.G:X2}{role.Color.B:X2}", + true) + .AddField(GetText(strs.mentionable), role.IsMentionable.ToString(), true) + .AddField(GetText(strs.hoisted), role.IsHoisted.ToString(), true) + .WithOkColor(); if (!string.IsNullOrWhiteSpace(role.GetIconUrl())) embed = embed.WithThumbnailUrl(role.GetIconUrl()); - + await Response().Embed(embed).SendAsync(); } @@ -133,12 +129,13 @@ public partial class Utility if (user is null) return; - var embed = _sender.CreateEmbed().AddField(GetText(strs.name), $"**{user.Username}**#{user.Discriminator}", true); + var embed = _sender.CreateEmbed() + .AddField(GetText(strs.name), $"**{user.Username}**#{user.Discriminator}", true); if (!string.IsNullOrWhiteSpace(user.Nickname)) embed.AddField(GetText(strs.nickname), user.Nickname, true); var joinedAt = GetJoinedAt(user); - + embed.AddField(GetText(strs.id), user.Id.ToString(), true) .AddField(GetText(strs.joined_server), $"{joinedAt?.ToString("dd.MM.yyyy HH:mm") ?? "?"}", true) .AddField(GetText(strs.joined_discord), $"{user.CreatedAt:dd.MM.yyyy HH:mm}", true) @@ -148,7 +145,7 @@ public partial class Utility .WithOkColor(); var patron = await _ps.GetPatronAsync(user.Id); - + if (patron.Tier != PatronTier.None) { embed.WithFooter(patron.Tier switch @@ -160,11 +157,11 @@ public partial class Utility _ => "❤️", }); } - + var av = user.RealAvatarUrl(); if (av.IsAbsoluteUri) embed.WithThumbnailUrl(av.ToString()); - + await Response().Embed(embed).SendAsync(); } @@ -204,12 +201,14 @@ public partial class Utility kvp.Value))); } - await Response().Embed(_sender.CreateEmbed() - .WithTitle(GetText(strs.activity_page(page + 1))) - .WithOkColor() - .WithFooter(GetText( - strs.activity_users_total(_cmdHandler.UserMessagesSent.Count))) - .WithDescription(str.ToString())).SendAsync(); + await Response() + .Embed(_sender.CreateEmbed() + .WithTitle(GetText(strs.activity_page(page + 1))) + .WithOkColor() + .WithFooter(GetText( + strs.activity_users_total(_cmdHandler.UserMessagesSent.Count))) + .WithDescription(str.ToString())) + .SendAsync(); } } } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Xp/XpService.cs b/src/NadekoBot/Modules/Xp/XpService.cs index 96d235c8d..fbddcd3be 100644 --- a/src/NadekoBot/Modules/Xp/XpService.cs +++ b/src/NadekoBot/Modules/Xp/XpService.cs @@ -422,8 +422,7 @@ public class XpService : INService, IReadyExecutor, IExecNoCommand return; await _sender.Response(chan) - .Confirm( - _strings.GetText(strs.level_up_global(user.Mention, + .Confirm(_strings.GetText(strs.level_up_global(user.Mention, Format.Bold(newLevel.ToString())), guild.Id)) .SendAsync(); diff --git a/src/NadekoBot/_common/Configs/BotConfig.cs b/src/NadekoBot/_common/Configs/BotConfig.cs index 5df5572c9..193c002ca 100644 --- a/src/NadekoBot/_common/Configs/BotConfig.cs +++ b/src/NadekoBot/_common/Configs/BotConfig.cs @@ -13,7 +13,7 @@ namespace NadekoBot.Common.Configs; public sealed partial class BotConfig : ICloneable { [Comment("""DO NOT CHANGE""")] - public int Version { get; set; } = 5; + public int Version { get; set; } = 6; [Comment(""" Most commands, when executed, have a small colored line diff --git a/src/NadekoBot/data/strings/commands/commands.en-US.yml b/src/NadekoBot/data/strings/commands/commands.en-US.yml index 5a2ec98bb..b88cfd155 100644 --- a/src/NadekoBot/data/strings/commands/commands.en-US.yml +++ b/src/NadekoBot/data/strings/commands/commands.en-US.yml @@ -437,9 +437,9 @@ remindlist: - "1" - "server 2" serverinfo: - desc: "Shows info about the server the bot is on. If no server is supplied, it defaults to current one." + desc: "Shows info about the server with the specified ID. The bot has to be on that server. If no server is supplied, it defaults to current one." args: - - "Some Server" + - "123123132233" channelinfo: desc: "Shows info about the channel. If no channel is supplied, it defaults to current one." args: diff --git a/src/NadekoBot/data/units.json b/src/NadekoBot/data/units.json index 30622d95e..2663b7ee9 100644 --- a/src/NadekoBot/data/units.json +++ b/src/NadekoBot/data/units.json @@ -719,6 +719,17 @@ "UnitType": "time", "Modifier": 60.0 }, + { + "Triggers": [ + "second", + "seconds", + "sec", + "secs", + "s" + ], + "UnitType": "time", + "Modifier": 1 + }, { "Triggers": [ "year",