private static string GetBansInfo(ulong userId) { var userBans = BanSQL.GetForUser(userId).Where(x => x.UnbanDateTime > DateTime.Now); if (userBans.Any()) { return($"{userBans.OrderBy(x => x.UnbanDateTime).FirstOrDefault().UnbanDateTime}"); } return(null); }
public async Task Ban(CommandContext ctx, DiscordMember member, string duration = "1d", [RemainingText] string reason = "Не указана") { if (!Bot.IsModerator(ctx.Member)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!"); return; } var durationTimeSpan = Utility.TimeSpanParse(duration); if (durationTimeSpan.TotalSeconds < 1) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!"); return; } var banDate = DateTime.Now; var unbanDate = DateTime.Now.Add(durationTimeSpan); var banId = RandomString.NextString(6); var ban = BanSQL.Create(banId, member.Id, ctx.Member.Id, reason, banDate, unbanDate); var guildMember = await ctx.Guild.GetMemberAsync(member.Id); try { await guildMember.SendMessageAsync( $"Вы были заблокированы на сервере **{ctx.Guild.Name}** на **{Utility.FormatTimespan(durationTimeSpan)}** до **{unbanDate} **. " + $"Модератор: **{ctx.Member.Username}#{ctx.Member.Discriminator}**. **Причина:** {reason}."); } catch (NotFoundException) { } catch (UnauthorizedException) { //user can block the bot } await guildMember.BanAsync(delete_message_days : 1); await ctx.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Бан**\n\n" + $"**Модератор:** {ctx.Member}\n" + $"**Пользователь:** {await ctx.Client.GetUserAsync(member.Id)}\n" + $"**Дата:** {DateTime.Now}\n" + $"**Разблокировка:** {unbanDate} | {Utility.FormatTimespan(durationTimeSpan)}\n" + $"**ID бана:** {banId}\n" + $"**Причина:** {reason}\n"); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно выдан бан **{member.Username}#{member.Discriminator}**! " + $"Снятие через: {Utility.FormatTimespan(durationTimeSpan)}!"); }
public async Task Unban(CommandContext ctx, DiscordUser member) { if (!Bot.IsModerator(ctx.Member)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!"); return; } var bans = BanSQL.GetForUser(member.Id); if (bans.Count == 0) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Пользователь не был забанен!"); return; } for (int i = 0; i < bans.Count; i++) { if (bans[i].UnbanDateTime > DateTime.Now) { bans[i].UnbanDateTime = DateTime.Now; } } try { await ctx.Guild.UnbanMemberAsync(member); } catch { } await ctx.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Снятие бана**\n\n" + $"**Модератор:** {ctx.Member}\n" + $"**Пользователь:** {await ctx.Client.GetUserAsync(member.Id)}\n" + $"**Дата:** {DateTime.Now}\n"); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно снят бан c {member.Mention}!"); }
public async Task BanDiscordUser(CommandContext ctx, DiscordUser user, string duration = "1d", [RemainingText] string reason = "Не указана") { if (!Bot.IsModerator(ctx.Member)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!"); return; } var durationTimeSpan = Utility.TimeSpanParse(duration); if (durationTimeSpan.TotalSeconds < 1) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!"); return; } var banDate = DateTime.Now; var unbanDate = DateTime.Now.Add(durationTimeSpan); var banId = RandomString.NextString(6); var ban = BanSQL.Create(banId, user.Id, ctx.Member.Id, reason, banDate, unbanDate); await ctx.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Бан**\n\n" + $"**Модератор:** {ctx.Member}\n" + $"**Пользователь:** {user.Username}\n" + $"**Дата:** {DateTime.Now}\n" + $"**Разблокировка:** {unbanDate} | {Utility.FormatTimespan(durationTimeSpan)}\n" + $"**ID бана:** {banId}\n" + $"**Причина:** {reason}\n"); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно выдан бан **{user.Username}#{user.Discriminator}**! " + $"Снятие через: {Utility.FormatTimespan(durationTimeSpan)}!"); }
private static async void CheckExpiredReports(object sender, ElapsedEventArgs e) { Client.Logger.LogDebug(BotLoggerEvents.Timers, $"CheckExpiredReports running"); var guild = await Client.GetGuildAsync(Bot.BotSettings.Guild); //Check for expired bans var toUnban = BanSQL.GetExpiredBans(); if (toUnban.Any()) { var bans = await guild.GetBansAsync(); foreach (var ban in toUnban) { for (int i = 0; i < bans.Count; ++i) { if (bans[i].User.Id == ban.User) { Client.Logger.LogDebug(BotLoggerEvents.Timers, $"Попытка снятия бана {ban}"); await guild.UnbanMemberAsync(ban.User); var user = await Client.GetUserAsync(ban.User); await guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Снятие бана**\n\n" + $"**Модератор:** {Client.CurrentUser.Username}\n" + $"**Пользователь:** {user}\n" + $"**Дата:** {DateTime.Now}\n"); Client.Logger.LogInformation(BotLoggerEvents.Timers, $"Пользователь {user} был разбанен."); break; } } } } //Check for expired mutes var reports = ReportSQL.GetExpiredReports(); foreach (var report in reports) { if (report.ReportType == ReportType.Mute) { Client.Logger.LogDebug(BotLoggerEvents.Timers, $"Попытка снятия блокировки {report}"); try { var user = await guild.GetMemberAsync(report.User); await user.RevokeRoleAsync(guild.GetRole(Bot.BotSettings.MuteRole), "Unmuted"); } catch (NotFoundException) { //Пользователь не найден } ReportSQL.Delete(report.Id); } else if (report.ReportType == ReportType.VoiceMute) { Client.Logger.LogDebug(BotLoggerEvents.Timers, $"Попытка снятия блокировки {report}"); try { var user = await guild.GetMemberAsync(report.User); await user.RevokeRoleAsync(guild.GetRole(Bot.BotSettings.VoiceMuteRole), "Unmuted"); } catch (NotFoundException) { //Пользователь не найден } ReportSQL.Delete(report.Id); } } }
public static async Task ClientOnGuildMemberAdded(DiscordClient client, GuildMemberAddEventArgs e) { //Проверка на бан var userBans = BanSQL.GetForUser(e.Member.Id); var unexpiredBans = new List <BanSQL>(); foreach (var ban in userBans) { if (ban.UnbanDateTime > DateTime.Now) { unexpiredBans.Add(ban); } } if (unexpiredBans.Any()) { var message = "**У вас есть неистёкшие блокировки на этом сервере:** \n"; foreach (var ban in unexpiredBans) { message += $"• **Причина:** {ban.Reason}. **Истекает через** {Utility.FormatTimespan(ban.UnbanDateTime - DateTime.Now)} | {ban.UnbanDateTime:dd.MM.yyyy HH:mm:ss}\n"; } try { await e.Member.SendMessageAsync(message); } catch (UnauthorizedException) { // if bot is in user's blacklist } await e.Member.BanAsync(); return; } //Проверка на mute var reports = ReportSQL.GetForUser(e.Member.Id).Where(x => x.ReportEnd > DateTime.Now); if (reports.Any()) { var blocksMessage = "**У вас есть неистекшие блокировки на этом сервере!**\n"; foreach (var report in reports) { string blockType = report.ReportType switch { ReportType.Mute => "Мут", ReportType.CodexPurge => "Блокировка принятия правил", ReportType.FleetPurge => "Блокировка рейдов", ReportType.VoiceMute => "Мут в голосовых каналах", _ => "" }; blocksMessage += $"• **{blockType}:** истекает через {Utility.FormatTimespan(report.ReportEnd - DateTime.Now)}\n"; if (report.ReportType == ReportType.Mute) { await e.Member.GrantRoleAsync(e.Guild.GetRole(Bot.BotSettings.MuteRole)); } else if (report.ReportType == ReportType.VoiceMute) { await e.Member.GrantRoleAsync(e.Guild.GetRole(Bot.BotSettings.VoiceMuteRole)); } else if (report.ReportType == ReportType.CodexPurge) { await e.Member.GrantRoleAsync(e.Guild.GetRole(Bot.BotSettings.PurgeCodexRole)); } } try { await e.Member.SendMessageAsync(blocksMessage); } catch (UnauthorizedException) { } } //Выдача доступа к приватным кораблям try { var ships = PrivateShip.GetUserShip(e.Member.Id); foreach (var ship in ships) { await e.Guild.GetChannel(ship.Channel).AddOverwriteAsync(e.Member, Permissions.UseVoice); } } catch (Exception ex) { client.Logger.LogWarning(BotLoggerEvents.Event, $"Ошибка при выдаче доступа к приватному кораблю. \n{ex.Message}\n{ex.StackTrace}"); } var invites = Invites.AsReadOnly().ToList(); //Сохраняем список старых инвайтов в локальную переменную var guildInvites = await e.Guild.GetInvitesAsync(); //Запрашиваем новый список инвайтов Invites = guildInvites.ToList(); //Обновляю список инвайтов try { await e.Member.SendMessageAsync($"**Привет, {e.Member.Mention}!\n**" + "Мы рады что ты присоединился к нашему сообществу :wink:!\n\n" + "Прежде чем приступать к игре, прочитай и прими правила в канале <#435486626551037963>.\n" + "После принятия можешь ознакомиться с гайдом по боту в канале <#476430819011985418>.\n" + "Если у тебя есть какие-то вопросы, не стесняйся писать администрации через бота. (Команда `!support`).\n\n" + "**Удачной игры!**"); } catch (UnauthorizedException) { //Пользователь заблокировал бота } // Выдача ролей, которые были у участника перед выходом. if (UsersLeftList.Users.ContainsKey(e.Member.Id)) { foreach (var role in UsersLeftList.Users[e.Member.Id].Roles) { try { await e.Member.GrantRoleAsync(e.Guild.GetRole(role)); } catch (NotFoundException) { } } UsersLeftList.Users.Remove(e.Member.Id); UsersLeftList.SaveToXML(Bot.BotSettings.UsersLeftXML); } //Определение инвайта try { //Находит обновившийся инвайт по количеству приглашений //Вызывает NullReferenceException в случае если ссылка только для одного использования var updatedInvite = guildInvites.ToList().Find(g => invites.Find(i => i.Code == g.Code).Uses < g.Uses); //Если не удалось определить инвайт, значит его нет в новых так как к.во использований ограничено и он был удален if (updatedInvite == null) { updatedInvite = invites.Where(p => guildInvites.All(p2 => p2.Code != p.Code)) //Ищем удаленный инвайт .Where(x => (x.CreatedAt.AddSeconds(x.MaxAge) < DateTimeOffset.Now)) //Проверяем если он не истёк .FirstOrDefault(); //С такими условиями будет только один такой инвайт } if (updatedInvite != null) { await e.Guild.GetChannel(Bot.BotSettings.UserlogChannel) .SendMessageAsync( $"**Участник присоединился:** {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) используя " + $"приглашение {updatedInvite.Code} от участника {updatedInvite.Inviter.Username}#{updatedInvite.Inviter.Discriminator}. "); client.Logger.LogInformation(BotLoggerEvents.Event, $"Участник {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) присоединился к серверу. " + $"Приглашение: {updatedInvite.Code} от участника {updatedInvite.Inviter.Username}#{updatedInvite.Inviter.Discriminator}."); //Проверяем если пригласивший уже существует, если нет то создаем if (!InviterList.Inviters.ContainsKey(updatedInvite.Inviter.Id)) { Inviter.Create(updatedInvite.Inviter.Id, e.Member.IsBot); } //Проверяем если пользователь был ранее приглашен другими и обновляем активность, если нет то вносим в список if (InviterList.Inviters.ToList().Exists(x => x.Value.Referrals.ContainsKey(e.Member.Id))) { InviterList.Inviters.ToList().Where(x => x.Value.Referrals.ContainsKey(e.Member.Id)).ToList() .ForEach(x => x.Value.UpdateReferral(e.Member.Id, true)); } else { InviterList.Inviters[updatedInvite.Inviter.Id].AddReferral(e.Member.Id); } InviterList.SaveToXML(Bot.BotSettings.InviterXML); //Обновление статистики приглашений await LeaderboardCommands.UpdateLeaderboard(e.Guild); } else { var guildInvite = await e.Guild.GetVanityInviteAsync(); if (guildInvite.Uses > GuildInviteUsage) { GuildInviteUsage = guildInvite.Uses; await e.Guild.GetChannel(Bot.BotSettings.UserlogChannel).SendMessageAsync( $"**Участник присоединился:** {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}). " + $"Используя персональную ссылку **{guildInvite.Code}**."); client.Logger.LogInformation(BotLoggerEvents.Event, $"Участник {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) присоединился к серверу. Используя персональную ссылку {guildInvite.Code}."); } else { await e.Guild.GetChannel(Bot.BotSettings.UserlogChannel) .SendMessageAsync( $"**Участник присоединился:** {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}). " + $"Приглашение не удалось определить."); client.Logger.LogInformation(BotLoggerEvents.Event, $"Участник {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) присоединился к серверу. Приглашение не удалось определить."); } } } catch (Exception ex) { await e.Guild.GetChannel(Bot.BotSettings.UserlogChannel) .SendMessageAsync( $"**Участник присоединился:** {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}). " + $"При попытке отследить инвайт произошла ошибка."); client.Logger.LogInformation(BotLoggerEvents.Event, $"Участник {e.Member.Username}#{e.Member.Discriminator} ({e.Member.Id}) присоединился к серверу. Приглашение не удалось определить.", DateTime.Now); client.Logger.LogWarning(BotLoggerEvents.Event, "Не удалось определить приглашение.", DateTime.Now); var errChannel = e.Guild.GetChannel(Bot.BotSettings.ErrorLog); var message = "**Ошибка при логгинге инвайта**\n" + $"**Пользователь:** {e.Member}\n" + $"**Исключение:** {ex.GetType()}:{ex.Message}\n" + $"**Трассировка стека:** \n```{ex.StackTrace}```\n" + $"{ex}"; await errChannel.SendMessageAsync(message); } //Обновляем статус бота await Bot.UpdateBotStatusAsync(client, e.Guild); }