mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2025-09-10 17:28:27 -04:00
214 lines
8.9 KiB
C#
214 lines
8.9 KiB
C#
#nullable disable
|
|
using System.Text;
|
|
using NadekoBot.Modules.Patronage;
|
|
|
|
namespace NadekoBot.Modules.Utility;
|
|
|
|
public partial class Utility
|
|
{
|
|
[Group]
|
|
public partial class InfoCommands : NadekoModule
|
|
{
|
|
private readonly DiscordSocketClient _client;
|
|
private readonly IStatsService _stats;
|
|
private readonly IPatronageService _ps;
|
|
|
|
public InfoCommands(DiscordSocketClient client, IStatsService stats, IPatronageService ps)
|
|
{
|
|
_client = client;
|
|
_stats = stats;
|
|
_ps = ps;
|
|
}
|
|
|
|
[Cmd]
|
|
[OwnerOnly]
|
|
public Task ServerInfo(ulong guildId)
|
|
=> InternalServerInfo(guildId);
|
|
|
|
[Cmd]
|
|
[RequireContext(ContextType.Guild)]
|
|
public Task ServerInfo()
|
|
=> InternalServerInfo(ctx.Guild.Id);
|
|
|
|
private async Task InternalServerInfo(ulong guildId)
|
|
{
|
|
var guild = (IGuild)_client.GetGuild(guildId)
|
|
?? await _client.Rest.GetGuildAsync(guildId);
|
|
|
|
if (guild is null)
|
|
return;
|
|
|
|
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);
|
|
var features = guild.Features.Value.ToString();
|
|
if (string.IsNullOrWhiteSpace(features))
|
|
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 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);
|
|
|
|
if (guild.Emotes.Any())
|
|
{
|
|
embed.AddField(GetText(strs.custom_emojis) + $"({guild.Emotes.Count})",
|
|
string.Join(" ", guild.Emotes.Shuffle().Take(20).Select(e => $"{e.Name} {e}")).TrimTo(1020));
|
|
}
|
|
|
|
await Response().Embed(embed).SendAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task ChannelInfo(ITextChannel channel = null)
|
|
{
|
|
var ch = channel ?? (ITextChannel)ctx.Channel;
|
|
if (ch is null)
|
|
return;
|
|
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();
|
|
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();
|
|
|
|
if (!string.IsNullOrWhiteSpace(role.GetIconUrl()))
|
|
embed = embed.WithThumbnailUrl(role.GetIconUrl());
|
|
|
|
await Response().Embed(embed).SendAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task UserInfo(IGuildUser usr = null)
|
|
{
|
|
var user = usr ?? ctx.User as IGuildUser;
|
|
|
|
if (user is null)
|
|
return;
|
|
|
|
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)
|
|
.AddField(GetText(strs.roles),
|
|
$"**({user.RoleIds.Count - 1})** - {string.Join("\n", user.GetRoles().Take(10).Where(r => r.Id != r.Guild.EveryoneRole.Id).Select(r => r.Name)).SanitizeMentions(true)}",
|
|
true)
|
|
.WithOkColor();
|
|
|
|
var mPatron = await _ps.GetPatronAsync(user.Id);
|
|
|
|
if (mPatron is {} patron && patron.Tier != PatronTier.None)
|
|
{
|
|
embed.WithFooter(patron.Tier switch
|
|
{
|
|
PatronTier.V => "❤️❤️",
|
|
PatronTier.X => "❤️❤️❤️",
|
|
PatronTier.XX => "❤️❤️❤️❤️",
|
|
PatronTier.L => "❤️❤️❤️❤️❤️",
|
|
_ => "❤️",
|
|
});
|
|
}
|
|
|
|
var av = user.RealAvatarUrl();
|
|
if (av.IsAbsoluteUri)
|
|
embed.WithThumbnailUrl(av.ToString());
|
|
|
|
await Response().Embed(embed).SendAsync();
|
|
}
|
|
|
|
private DateTimeOffset? GetJoinedAt(IGuildUser user)
|
|
{
|
|
var joinedAt = user.JoinedAt;
|
|
if (user.GuildId != 117523346618318850)
|
|
return joinedAt;
|
|
|
|
if (user.Id == 351244576092192778)
|
|
return new DateTimeOffset(2019, 12, 25, 9, 33, 0, TimeSpan.Zero);
|
|
|
|
return joinedAt;
|
|
}
|
|
|
|
[Cmd]
|
|
[RequireContext(ContextType.Guild)]
|
|
[OwnerOnly]
|
|
public async Task Activity(int page = 1)
|
|
{
|
|
const int activityPerPage = 10;
|
|
page -= 1;
|
|
|
|
if (page < 0)
|
|
return;
|
|
|
|
var startCount = page * activityPerPage;
|
|
|
|
var str = new StringBuilder();
|
|
foreach (var kvp in _cmdHandler.UserMessagesSent.OrderByDescending(kvp => kvp.Value)
|
|
.Skip(page * activityPerPage)
|
|
.Take(activityPerPage))
|
|
{
|
|
str.AppendLine(GetText(strs.activity_line(++startCount,
|
|
Format.Bold(kvp.Key.ToString()),
|
|
kvp.Value / _stats.GetUptime().TotalSeconds,
|
|
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();
|
|
}
|
|
}
|
|
} |