public async Task FleetPurge(CommandContext ctx, DiscordUser member, string duration = "1d", [RemainingText] string reason = "Не указана") //Блокирует возможность принять правила на время { var isFleetCaptain = ctx.Member.Roles.Contains(ctx.Guild.GetRole(Bot.BotSettings.FleetCaptainRole)) && !Bot.IsModerator(ctx.Member) && !ctx.Member.Roles.Any(x => x.Id == Bot.BotSettings.HelperRole); //Только капитаны рейда, модераторы и хелперы не учитываются var durationTimeSpan = Utility.TimeSpanParse(duration); var id = RandomString.NextString(6); if (durationTimeSpan.TotalDays > 3 && isFleetCaptain) //Максимальное время блокировки капитанам 1day { durationTimeSpan = new TimeSpan(3, 0, 0, 0); } var reportEnd = DateTime.Now + durationTimeSpan; ReportSQL fleetPurge = null; var reports = ReportSQL.GetForUser(member.Id, ReportType.FleetPurge); if (reports.Any() && reports.First().ReportEnd > DateTime.Now) { fleetPurge = reports.First(); fleetPurge.ReportEnd = reportEnd; } else { fleetPurge = ReportSQL.Create(id, member.Id, ctx.Member.Id, reason, DateTime.Now, reportEnd, ReportType.FleetPurge); if (fleetPurge.ReportDuration.TotalSeconds < 1) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!"); return; } } //Отправка в журнал await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Блокировка принятия правил рейда**\n\n" + $"**Модератор:** {ctx.Member}\n" + $"**Пользователь:** {member}\n" + $"**Дата:** {DateTime.Now:HH:mm:ss dd.MM.yyyy}\n" + $"**Снятие через:** {Utility.FormatTimespan(fleetPurge.ReportDuration)} | {fleetPurge.ReportEnd::HH:mm:ss dd.MM.yyyy}\n" + $"**Причина:** {reason}\n" + $"**ID:** {id}"); //Ответное сообщение в чат await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно отобрано право принять правила рейда {member.Mention}. " + $"Снятие через: {Utility.FormatTimespan(fleetPurge.ReportDuration)}!"); }
public async Task Purge(CommandContext ctx, DiscordUser member, string duration, [RemainingText] string reason = "Не указана") //Блокирует возможность принять правила на время { if (!Bot.IsModerator(ctx.Member)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!"); return; } var id = RandomString.NextString(6); var reportEnd = DateTime.Now + Utility.TimeSpanParse(duration); ReportSQL purge = null; //Возможна только одна блокировка, если уже существует то перезаписываем var reports = ReportSQL.GetForUser(member.Id, ReportType.CodexPurge); if (reports.Any() && reports.First().ReportEnd > DateTime.Now) { purge = reports.First(); purge.ReportEnd = reportEnd; } else { purge = ReportSQL.Create(id, member.Id, ctx.Member.Id, reason, DateTime.Now, reportEnd, ReportType.CodexPurge); if (purge.ReportDuration.TotalSeconds < 1) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!"); return; } } //Отправка в журнал await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Блокировка доступа к рейдам**\n\n" + $"**Модератор:** {ctx.Member}\n" + $"**Пользователь:** {member}\n" + $"**Дата:** {DateTime.Now:HH:mm:ss dd.MM.yyyy}\n" + $"**Снятие через:** {Utility.FormatTimespan(purge.ReportDuration)} | {reportEnd:HH:mm:ss dd.MM.yyyy}\n" + $"**Причина:** {reason}\n" + $"**ID:** {id}"); //Ответное сообщение в чат await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно заблокирован доступ к рейдам {member.Mention}. " + $"Снятие через {Utility.FormatTimespan(purge.ReportDuration)}!"); }
public async Task Mute(CommandContext ctx, DiscordUser member, string duration, [RemainingText] string reason = "Не указана") { if (!Bot.IsModerator(ctx.Member)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!"); return; } var durationTimeSpan = Utility.TimeSpanParse(duration); var id = RandomString.NextString(6); var reportEnd = DateTime.Now + durationTimeSpan; ReportSQL mute = null; var reports = ReportSQL.GetForUser(member.Id, ReportType.Mute); if (reports.Any() && reports.First().ReportEnd > DateTime.Now) { mute = reports.First(); mute.ReportEnd = reportEnd; } else { mute = ReportSQL.Create(id, member.Id, ctx.Member.Id, reason, DateTime.Now, reportEnd, ReportType.Mute); } //Отправка в журнал await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Мут**\n\n" + $"**От:** {ctx.Member}\n" + $"**Кому:** {member}\n" + $"**Дата:** {DateTime.Now}\n" + $"**Снятие через:** {Utility.FormatTimespan(mute.ReportDuration)}\n" + $"**Причина:** {reason}\n" + $"**ID:** {id}"); //Ответное сообщение в чат await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно выдан мут {member.Mention}. " + $"Снятие через: {Utility.FormatTimespan(mute.ReportDuration)}!"); }
public async Task VoiceMute(CommandContext ctx, DiscordMember member, string duration, [RemainingText] string reason = "Не указана") { if (!Bot.IsModerator(ctx.Member)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!"); return; } var durationTimeSpan = Utility.TimeSpanParse(duration); var id = RandomString.NextString(6); var reportEnd = DateTime.Now + durationTimeSpan; ReportSQL mute = null; var reports = ReportSQL.GetForUser(member.Id, ReportType.VoiceMute); if (reports.Any() && reports.First().ReportEnd > DateTime.Now) { mute = reports.First(); mute.ReportEnd = reportEnd; } else { mute = ReportSQL.Create(id, member.Id, ctx.Member.Id, reason, DateTime.Now, reportEnd, ReportType.VoiceMute); } //Выдаем роль мута await member.GrantRoleAsync(ctx.Channel.Guild.GetRole(Bot.BotSettings.VoiceMuteRole)); //Отправка сообщения в лс try { await member.SendMessageAsync( $"**Вам выдан мут в голосовом чате**\n\n" + $"**Снятие через:** {Utility.FormatTimespan(mute.ReportDuration)}\n" + $"**Модератор:** {ctx.Member.Username}#{ctx.Member.Discriminator}\n" + $"**Причина:** {reason}"); } catch (UnauthorizedException) { //user can block the bot } //Отправка в журнал await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Мут в голосовом чате**\n\n" + $"**От:** {ctx.Member}\n" + $"**Кому:** {member}\n" + $"**Дата:** {DateTime.Now}\n" + $"**Снятие через:** {Utility.FormatTimespan(mute.ReportDuration)}\n" + $"**Причина:** {reason}"); //Ответное сообщение в чат await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно выдан мут в голосовом чате {member.Mention}. " + $"Снятие через: {Utility.FormatTimespan(mute.ReportDuration)}!"); }
public async Task FleetPurge(CommandContext ctx, DiscordMember member, string duration = "1d", [RemainingText] string reason = "Не указана") //Блокирует возможность принять правила на время { var isFleetCaptain = ctx.Member.Roles.Contains(ctx.Guild.GetRole(Bot.BotSettings.FleetCaptainRole)) && !Bot.IsModerator(ctx.Member) && !ctx.Member.Roles.Any(x => x.Id == Bot.BotSettings.HelperRole); //Только капитаны рейда, модераторы и хелперы не учитываются //Проверка на кик модератора капитаном рейда if (Bot.IsModerator(member) && isFleetCaptain) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы не можете исключить данного пользователя! <@&514282258958385152>"); return; } var durationTimeSpan = Utility.TimeSpanParse(duration); var id = RandomString.NextString(6); if (durationTimeSpan.TotalDays > 3 && isFleetCaptain) //Максимальное время блокировки капитанам 1day { durationTimeSpan = new TimeSpan(3, 0, 0, 0); } var reportEnd = DateTime.Now + durationTimeSpan; ReportSQL fleetPurge = null; var reports = ReportSQL.GetForUser(member.Id, ReportType.FleetPurge); if (reports.Any() && reports.First().ReportEnd > DateTime.Now) { fleetPurge = reports.First(); fleetPurge.ReportEnd = reportEnd; } else { fleetPurge = ReportSQL.Create(id, member.Id, ctx.Member.Id, reason, DateTime.Now, reportEnd, ReportType.FleetPurge); if (fleetPurge.ReportDuration.TotalSeconds < 1) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!"); return; } } //Убираем роль правил await member.RevokeRoleAsync(ctx.Channel.Guild.GetRole(Bot.BotSettings.FleetCodexRole)); //Отправка сообщения в лс try { await member.SendMessageAsync( $"**Доступ к рейдам заблокирован**\n" + $"**Снятие через:** {Utility.FormatTimespan(fleetPurge.ReportDuration)}\n" + $"**Модератор:** {ctx.Member.Username}#{ctx.Member.Discriminator}\n" + $"**Причина:** {fleetPurge.Reason}"); } catch (UnauthorizedException) { //user can block the bot } //Отправка в журнал await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Блокировка доступа к рейдам**\n\n" + $"**Модератор:** {ctx.Member}\n" + $"**Пользователь:** {member}\n" + $"**Дата:** {DateTime.Now:HH:mm:ss dd.MM.yyyy}\n" + $"**Снятие через:** {Utility.FormatTimespan(fleetPurge.ReportDuration)} | {fleetPurge.ReportEnd::HH:mm:ss dd.MM.yyyy}\n" + $"**Причина:** {reason}\n" + $"**ID:** {id}"); //Ответное сообщение в чат await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно заблокирован доступ к рейдам {member.Mention}. " + $"Снятие через: {Utility.FormatTimespan(fleetPurge.ReportDuration)}!"); }
public async Task Purge(CommandContext ctx, DiscordMember member, string duration, [RemainingText] string reason = "Не указана") //Блокирует возможность принять правила на время { if (!Bot.IsModerator(ctx.Member)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} У вас нет доступа к этой команде!"); return; } var id = RandomString.NextString(6); var reportEnd = DateTime.Now + Utility.TimeSpanParse(duration); ReportSQL purge = null; //Возможна только одна блокировка, если уже существует то перезаписываем var reports = ReportSQL.GetForUser(member.Id, ReportType.CodexPurge); if (reports.Any() && reports.First().ReportEnd > DateTime.Now) { purge = reports.First(); purge.ReportEnd = reportEnd; } else { purge = ReportSQL.Create(id, member.Id, ctx.Member.Id, reason, DateTime.Now, reportEnd, ReportType.CodexPurge); if (purge.ReportDuration.TotalSeconds < 1) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не удалось определить время!"); return; } } //Убираем роль правил await member.RevokeRoleAsync(ctx.Channel.Guild.GetRole(Bot.BotSettings.CodexRole)); await member.GrantRoleAsync(ctx.Channel.Guild.GetRole(Bot.BotSettings.PurgeCodexRole)); //Отправка сообщения в лс try { await member.SendMessageAsync( $"**Еще раз внимательно прочитайте правила сервера**\n\n" + $"**Возможность принять правила заблокирована**\n" + $"**Снятие через** {Utility.FormatTimespan(purge.ReportDuration)}\n" + $"**Модератор:** {ctx.Member.Username}#{ctx.Member.Discriminator}\n" + $"**Причина:** {purge.Reason}"); } catch (UnauthorizedException) { //user can block the bot } //Отправка в журнал await ctx.Channel.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync( "**Блокировка принятия правил**\n\n" + $"**Модератор:** {ctx.Member}\n" + $"**Пользователь:** {member}\n" + $"**Дата:** {DateTime.Now:HH:mm:ss dd.MM.yyyy}\n" + $"**Снятие через:** {Utility.FormatTimespan(purge.ReportDuration)} | {reportEnd:HH:mm:ss dd.MM.yyyy}\n" + $"**Причина:** {reason}\n" + $"**ID:** {id}"); //Ответное сообщение в чат await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно отобрано право принять правила {member.Mention}. " + $"Снятие через {Utility.FormatTimespan(purge.ReportDuration)}!"); }
public static async Task ClientOnMessageReactionAdded(DiscordClient client, MessageReactionAddEventArgs e) { var discordUser = await client.GetUserAsync(e.User.Id); if (discordUser.IsBot) { return; } //Проверка если сообщение с принятием правил сообщества if (e.Message.Id == Bot.BotSettings.CodexMessageId && e.Emoji.GetDiscordName() == ":white_check_mark:") { //При надобности добавить кулдаун /*if (EmojiCooldowns.ContainsKey(e.User)) // проверка на кулдаун * if ((EmojiCooldowns[e.User] - DateTime.Now).Seconds > 0) return; * * // если проверка успешно пройдена, добавим пользователя * // в словарь кулдаунов * EmojiCooldowns[e.User] = DateTime.Now.AddSeconds(Bot.BotSettings.FastCooldown);*/ //Проверка на purge var hasPurge = false; ReportSQL validPurge = null; foreach (var purge in ReportSQL.GetForUser(discordUser.Id, ReportType.CodexPurge)) { if (purge.ReportEnd > DateTime.Now) { validPurge = purge; hasPurge = true; break; } } if (hasPurge) { var moderator = await e.Channel.Guild.GetMemberAsync(validPurge.Moderator); try { await(await e.Guild.GetMemberAsync(discordUser.Id)).SendMessageAsync( "**Возможность принять правила заблокирована**\n" + $"**Снятие через:** {Utility.FormatTimespan(DateTime.Now - validPurge.ReportEnd)}\n" + $"**Модератор:** {moderator.Username}#{moderator.Discriminator}\n" + $"**Причина:** {validPurge.Reason}\n"); } catch (UnauthorizedException) { //user can block the bot } return; } //Выдаем роль правил var member = await e.Guild.GetMemberAsync(discordUser.Id); //Проверка времени входа на сервер. if (member.JoinedAt > DateTime.Now.AddMinutes(-10)) { try { await member.SendMessageAsync( $"{Bot.BotSettings.ErrorEmoji} Для принятия правил вы должны находиться на сервере минимум " + $"**{Utility.FormatTimespan(TimeSpan.FromMinutes(10))}**."); await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member); } catch (UnauthorizedException) { } return; } if (!member.Roles.Contains(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole))) { //Выдаем роль правил await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole)); //Убираем роль блокировки правил await member.RevokeRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.PurgeCodexRole)); client.Logger.LogInformation(BotLoggerEvents.Event, $"Пользователь {discordUser.Username}#{discordUser.Discriminator} ({discordUser.Id}) подтвердил прочтение правил через реакцию."); } return; } //Проверка если сообщение с принятием правил рейда if (e.Message.Id == Bot.BotSettings.FleetCodexMessageId && e.Emoji.GetDiscordName() == ":white_check_mark:") { //Проверка на purge var hasPurge = false; ReportSQL validPurge = null; foreach (var purge in ReportSQL.GetForUser(discordUser.Id, ReportType.FleetPurge)) { if (purge.ReportEnd > DateTime.Now) { validPurge = purge; hasPurge = true; break; } } if (hasPurge) { var moderator = await e.Channel.Guild.GetMemberAsync(validPurge.Moderator); try { await(await e.Guild.GetMemberAsync(discordUser.Id)).SendMessageAsync( "**Возможность принять правила заблокирована**\n" + $"**Снятие через:** {Utility.FormatTimespan(DateTime.Now - validPurge.ReportEnd)}\n" + $"**Модератор:** {moderator.Username}#{moderator.Discriminator}\n" + $"**Причина:** {validPurge.Reason}\n"); } catch (UnauthorizedException) { //user can block the bot } return; } //Удаляем блокировку если истекла var member = await e.Guild.GetMemberAsync(discordUser.Id); //Проверка времени входа на сервер. if (member.JoinedAt > DateTime.Now.AddDays(-Bot.BotSettings.FleetDateOffset)) { await member.SendMessageAsync( $"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вы должны находиться на сервере " + $"**{Utility.FormatTimespan(TimeSpan.FromDays(Bot.BotSettings.FleetDateOffset))}**."); await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member); return; } var voiceTime = VoiceListener.GetUpdatedVoiceTime(e.User.Id); //Проверка на время проведенное в голосовых каналах if (voiceTime < TimeSpan.FromHours(Bot.BotSettings.FleetVoiceTimeOffset)) { await member.SendMessageAsync( $"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вы должны провести " + $"**{Utility.FormatTimespan(TimeSpan.FromHours(Bot.BotSettings.FleetVoiceTimeOffset))}** в голосовых каналах. " + $"Ваше время: **{Utility.FormatTimespan(voiceTime)}**"); await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member); return; } //Проверка на регистрацию и привязку Xbox var webUser = WebUser.GetByDiscordId(member.Id); if (webUser == null) { await member.SendMessageAsync( $"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вам нужно авторизоваться с помощью Discord на сайте {Bot.BotSettings.WebURL}login."); await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member); return; } if (webUser.LastXbox == "") { await member.SendMessageAsync($"{Bot.BotSettings.ErrorEmoji} Для получения доступа к рейдам вы должны привязать Xbox к своему аккаунту, затем перейдите по ссылке " + $"{Bot.BotSettings.WebURL}xbox - это обновит базу данных."); await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member); return; } // Проверка ЧС if (BlacklistEntry.IsBlacklisted(member.Id) || BlacklistEntry.IsBlacklistedXbox(webUser.LastXbox)) { await member.SendMessageAsync( $"{Bot.BotSettings.ErrorEmoji} Вы находитесь в чёрном списке рейдов и вам навсегда ограничен доступ к ним."); return; } //Выдаем роль правил рейда if (!member.Roles.Any(x => x.Id == Bot.BotSettings.FleetCodexRole)) { await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.FleetCodexRole)); await e.Guild.GetChannel(Bot.BotSettings.FleetLogChannel) .SendMessageAsync($"{DiscordEmoji.FromName(client, ":new:")} Пользователь **{e.User.Username}#{e.User.Discriminator}** ({e.User.Id}) получил роль рейда. **Xbox:** {webUser.LastXbox}."); client.Logger.LogInformation(BotLoggerEvents.Event, $"Пользователь {discordUser.Username}#{discordUser.Discriminator} ({discordUser.Id}) подтвердил прочтение правил рейда."); } return; } //Проверка на сообщение эмиссарства if (e.Message.Id == Bot.BotSettings.EmissaryMessageId) { await e.Message.DeleteReactionAsync(e.Emoji, discordUser); if (EmojiCooldowns.ContainsKey(discordUser)) // проверка на кулдаун { if ((EmojiCooldowns[discordUser] - DateTime.Now).Seconds > 0) { return; } } // если проверка успешно пройдена, добавим пользователя // в словарь кулдаунов EmojiCooldowns[discordUser] = DateTime.Now.AddSeconds(Bot.BotSettings.FastCooldown); //Проверка у пользователя уже существующих ролей эмисарства и их удаление var member = await e.Guild.GetMemberAsync(discordUser.Id); member.Roles.Where(x => x.Id == Bot.BotSettings.EmissaryGoldhoadersRole || x.Id == Bot.BotSettings.EmissaryTradingCompanyRole || x.Id == Bot.BotSettings.EmissaryOrderOfSoulsRole || x.Id == Bot.BotSettings.EmissaryAthenaRole || x.Id == Bot.BotSettings.EmissaryReaperBonesRole || x.Id == Bot.BotSettings.HuntersRole).ToList() .ForEach(async x => await member.RevokeRoleAsync(x)); //Выдаем роль в зависимости от реакции switch (e.Emoji.GetDiscordName()) { case ":moneybag:": await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryGoldhoadersRole)); break; case ":pig:": await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryTradingCompanyRole)); break; case ":skull:": await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryOrderOfSoulsRole)); break; case ":gem:": await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryAthenaRole)); break; case ":skull_crossbones:": await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.EmissaryReaperBonesRole)); break; case ":fish:": await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.HuntersRole)); break; default: break; } //Отправка в лог client.Logger.LogInformation(BotLoggerEvents.Event, $"{discordUser.Username}#{discordUser.Discriminator} получил новую роль эмиссарства."); return; } if (e.Message.Channel != null) { //Проверка на голосование if (e.Message.Channel.Id == Bot.BotSettings.VotesChannel) { var vote = Vote.GetByMessageId(e.Message.Id); await e.Message.DeleteReactionAsync(e.Emoji, discordUser); // Проверка на окончание голосования if (DateTime.Now > vote.End) { return; } // Проверка на предыдущий голос if (vote.Voters.ContainsKey(discordUser.Id)) { return; } if (e.Emoji.GetDiscordName() == ":white_check_mark:") { vote.Voters.Add(discordUser.Id, true); ++vote.Yes; } else { vote.Voters.Add(discordUser.Id, false); ++vote.No; } var total = vote.Voters.Count; var author = await e.Guild.GetMemberAsync(vote.Author); var embed = Utility.GenerateVoteEmbed( author, DiscordColor.Yellow, vote.Topic, vote.End, vote.Voters.Count, vote.Yes, vote.No, vote.Id); Vote.Save(Bot.BotSettings.VotesXML); await e.Message.ModifyAsync(embed : embed); await(await e.Guild.GetMemberAsync(discordUser.Id)).SendMessageAsync($"{Bot.BotSettings.OkEmoji} Спасибо, ваш голос учтён!"); } // Private ship confirmation message if (e.Channel.Id == Bot.BotSettings.PrivateRequestsChannel) { var ship = PrivateShip.GetByRequest(e.Message.Id); if (ship != null && ship.Channel == 0) { if (e.Emoji == DiscordEmoji.FromName(client, ":white_check_mark:")) { var channel = await e.Guild.CreateChannelAsync($"☠{ship.Name}☠", ChannelType.Voice, e.Guild.GetChannel(Bot.BotSettings.PrivateCategory), bitrate : Bot.BotSettings.Bitrate); await channel.AddOverwriteAsync(e.Guild.GetRole(Bot.BotSettings.CodexRole), Permissions.AccessChannels); await channel.AddOverwriteAsync(e.Guild.EveryoneRole, Permissions.None, Permissions.UseVoice); ship.Channel = channel.Id; ship.CreatedAt = DateTime.Now; ship.LastUsed = DateTime.Now; var captain = (from member in ship.GetMembers() where member.Role == PrivateShipMemberRole.Captain select member).First(); var captainMember = await e.Guild.GetMemberAsync(captain.MemberId); await channel.AddOverwriteAsync(captainMember, Permissions.UseVoice); captain.Status = true; await e.Channel.SendMessageAsync( $"{Bot.BotSettings.OkEmoji} Администратор {e.User.Mention} подтвердил запрос на создание " + $"корабля **{ship.Name}**."); try { await captainMember.SendMessageAsync( $"{Bot.BotSettings.OkEmoji} Администратор **{e.User.Username}#{e.User.Discriminator}** " + $"подтвердил твой запрос на создание корабля **{ship.Name}**."); } catch (UnauthorizedException) { } } else if (e.Emoji == DiscordEmoji.FromName(client, ":no_entry:")) { var captain = (from member in ship.GetMembers() where member.Role == PrivateShipMemberRole.Captain select member).First(); var captainMember = await e.Guild.GetMemberAsync(captain.MemberId); PrivateShip.Delete(ship.Name); await e.Channel.SendMessageAsync( $"{Bot.BotSettings.OkEmoji} Администратор {e.User.Mention} отклонил запрос на создание " + $"корабля **{ship.Name}**."); try { await captainMember.SendMessageAsync( $"{Bot.BotSettings.ErrorEmoji} Администратор **{e.User.Username}#{e.User.Discriminator}** " + $"отклонил твой запрос на создание корабля **{ship.Name}**."); } catch (UnauthorizedException) { } } await e.Message.DeleteAllReactionsAsync(); } } } }
public async Task WhoIs(CommandContext ctx, [Description("Пользователь"), RemainingText] DiscordUser user) { if (user.Id == 261137595965243393) { Random random = new Random(); int value = random.Next(100); if (value < 30) { await ctx.RespondAsync("https://media.giphy.com/media/eKrgVyZ7zLvJrgZNZn/giphy.gif"); return; } } await ctx.TriggerTypingAsync(); try { DiscordMember member = null; try { member = await ctx.Guild.GetMemberAsync(user.Id); } catch (NotFoundException) { // is not a member of the guild } //Сбор информации в переменные var ban = GetBansInfo(user.Id); var warnings = WarnSQL.GetForUser(user.Id).Count; var reports = ReportSQL.GetForUser(user.Id); var webUser = WebUser.GetByDiscordId(user.Id); var voiceTime = VoiceListener.GetUpdatedVoiceTime(user.Id); //Создание эмбеда var embed = new DiscordEmbedBuilder(); embed.WithAuthor($"{user.Username}#{user.Discriminator}", iconUrl: user.AvatarUrl); embed.WithThumbnail(user.AvatarUrl); //Статус на сервере if (ban != null) { embed.WithColor(new DiscordColor("#c0392b")); embed.WithDescription($"Забанен до {ban}."); } else if (member == null) { embed.WithColor(new DiscordColor("#e67e22")); embed.WithDescription("Не является участником."); } else { embed.WithColor(new DiscordColor("#27ae60")); embed.WithDescription("Участник сервера."); } //1 Row - ID, Username embed.AddFieldOrDefault("ID", user.Id.ToString(), true); if (member != null) { embed.AddFieldOrDefault("Имя на сервере", member.Mention, true); } embed.NewInlineRow(); //2 Row - Creation and join dates, VoiceTime embed.AddFieldOrDefault("Создан", user.CreationTimestamp.ToString("HH:mm:ss \n dd.MM.yyyy"), true); if (member != null) { embed.AddFieldOrDefault("Присоединился", member.JoinedAt.ToString("HH:mm:ss \n dd.MM.yyyy"), true); } embed.AddFieldOrDefault("Время в каналах", $"{(voiceTime.Days * 24) + voiceTime.Hours}:{voiceTime.Minutes}", true); //3 Row - WebUser info if (webUser != null) { embed.AddFieldOrDefault("Привязка", "Да", true); embed.AddFieldOrEmpty("Страна", GetCountryFlag(webUser.LastIp), true); if (!string.IsNullOrEmpty(webUser.LastXbox)) { embed.AddFieldOrDefault("Xbox", webUser.LastXbox.ToString(), true); } else { embed.AddFieldOrDefault("Xbox", "Нет", true); } } embed.NewInlineRow(); //4 Row - Donate info embed.AddFieldOrReplace("Донат", GetDonationInfo(user.Id), "Нет", true); embed.AddFieldOrReplace("Подписка", GetSubscriptionInfo(user.Id), "Нет", true); embed.AddFieldOrReplace("Приватный корабль", GetPrivateShip(user.Id), "Нет", true); embed.NewInlineRow(); //5 Row - Reports info embed.AddFieldOrDefault("Предупреждения", $":pencil: {warnings}", true); embed.AddFieldOrDefault("Правила", GetCodexInfo(reports, member), true); embed.AddFieldOrDefault("Правила рейда", GetFleetCodexInfo(reports, member), true); embed.AddFieldOrDefault("Мут", $"{GetMutesInfo(reports)}", true); embed.AddFieldOrDefault("Голосовой мут", $"{GetVoiceMutesInfo(reports)}", true); embed.NewInlineRow(); //6 Row - Note if (Note.Notes.ContainsKey(user.Id)) { embed.AddFieldOrDefault("Заметка", Note.Notes[user.Id].Content); } embed.WithFooter("(*) Не принял после разблокировки"); var message = await ctx.RespondAsync(embed : embed.Build()); //Реакция на вывод сообщения с предупреждениями if (warnings > 0) { var interactivity = ctx.Client.GetInteractivity(); var emoji = DiscordEmoji.FromName(ctx.Client, ":pencil:"); await message.CreateReactionAsync(emoji); var em = await interactivity.WaitForReactionAsync(xe => xe.Emoji == emoji, message, ctx.User, TimeSpan.FromSeconds(60)); if (!em.TimedOut) { await ctx.TriggerTypingAsync(); var command = $"whois wl {user.Id}"; var cmds = ctx.CommandsNext; // Ищем команду и извлекаем параметры. var cmd = cmds.FindCommand(command, out var customArgs); // Создаем фейковый контекст команды. var fakeContext = cmds.CreateFakeContext(ctx.Member, ctx.Channel, command, ctx.Prefix, cmd, customArgs); // Выполняем команду за пользователя. await cmds.ExecuteCommandAsync(fakeContext); } else { await message.DeleteAllReactionsAsync(); } } } catch (NotFoundException) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Пользователь не найден."); } }
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 LogOnMessageCreated(DiscordClient client, MessageCreateEventArgs e) { if (e.Guild != null) { //TODO: REMOVE THIS -> Автобан за гифку if (e.Message.Content == "https://media.discordapp.net/attachments/741675549612572793/782183382850600960/not_spoiler.gif" || e.Message.Content.Contains("https://media.discordapp.net/attachments/741675549612572793/782183382850600960/not_spoiler.gif") || e.Message.Content.Contains("not_spoiler.gif")) { var member = await e.Guild.GetMemberAsync(e.Author.Id); await member.BanAsync(1); } if (e.Channel.Id == Bot.BotSettings.CodexReserveChannel) { if (!Bot.IsModerator(await e.Guild.GetMemberAsync(e.Author.Id))) { await e.Message.DeleteAsync(); } //Проверка на purge var hasPurge = false; ReportSQL validPurge = null; foreach (var purge in ReportSQL.GetForUser(e.Message.Author.Id, ReportType.CodexPurge)) { if (purge.ReportEnd > DateTime.Now) { validPurge = purge; hasPurge = true; break; } } if (hasPurge) { var moderator = await e.Channel.Guild.GetMemberAsync(validPurge.Moderator); try { await((DiscordMember)e.Author).SendMessageAsync( "**Возможность принять правила заблокирована**\n" + $"**Снятие через:** {Utility.FormatTimespan(DateTime.Now - validPurge.ReportEnd)}\n" + $"**Модератор:** {moderator.Username}#{moderator.Discriminator}\n" + $"**Причина:** {validPurge.Reason}\n"); } catch (UnauthorizedException) { //user can block the bot } return; } //Выдаем роль правил var member = await e.Guild.GetMemberAsync(e.Author.Id); //Проверка времени входа на сервер. if (member.JoinedAt > DateTime.Now.AddMinutes(-10)) { try { await member.SendMessageAsync( $"{Bot.BotSettings.ErrorEmoji} Для принятия правил вы должны находиться на сервере минимум " + $"**{Utility.FormatTimespan(TimeSpan.FromMinutes(10))}**."); await e.Message.DeleteReactionAsync(DiscordEmoji.FromName(client, ":white_check_mark:"), member); } catch (UnauthorizedException) { } return; } else if (!member.Roles.Contains(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole))) { //Выдаем роль правил await member.GrantRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.CodexRole)); //Убираем роль блокировки правил await member.RevokeRoleAsync(e.Channel.Guild.GetRole(Bot.BotSettings.PurgeCodexRole)); client.Logger.LogInformation(BotLoggerEvents.Event, $"Пользователь {e.Author.Username}#{e.Author.Discriminator} ({e.Author.Id}) подтвердил прочтение правил через сообщение."); } } if (e.Message.Attachments.Count > 0 && !e.Message.Author.IsBot) { var message = $"**Автор:** {e.Message.Author}\n" + $"**Канал:** {e.Message.Channel}\n" + $"**Сообщение:** {e.Message.Id}\n" + $"**Вложение:**\n"; using (var wClient = new WebClient()) { var attachment = e.Message.Attachments[0]; //проверить: не может быть больше 1 вложения в сообщении var file = $"generated/attachments/{attachment.FileName}"; wClient.DownloadFile(attachment.Url, file); //TODO: REMOVE THIS -> Автобан за гифку if ((new FileInfo(file).Length) == 1058939) { var member = await e.Guild.GetMemberAsync(e.Author.Id); await member.BanAsync(1); } //TODO else { var logMessage = await e.Guild.GetChannel(Bot.BotSettings.AttachmentsLog).SendFileAsync(file, message); File.Delete(file); using (var fs = new FileStream("generated/attachments_messages.csv", FileMode.Append)) using (var sw = new StreamWriter(fs)) await sw.WriteLineAsync($"{e.Message.Id},{logMessage.Id}"); } } } if (e.Message.Content.StartsWith("> ")) { if (Bot.IsModerator(await e.Guild.GetMemberAsync(e.Author.Id))) { var messageStrings = e.Message.Content.Split('\n'); var command = ""; foreach (var str in messageStrings) { if (str.StartsWith("<@")) { command = str; break; } } var args = command.Split(' '); var receiver = args[0]; var action = args[1]; switch (action) { case "w": await e.Message.DeleteAsync(); Bot.RunCommand(client, CommandType.Warn, args, e.Message); return; default: return; } } } //Чистка сообщений в канале поиска игроков if (e.Channel.Id == Bot.BotSettings.FindChannel && e.Message.Embeds.Count() == 0 && !e.Message.Pinned) { //Проверка если сообщение содержит команду, если нет то отправляем инструкцию в лс. if (!e.Message.Content.StartsWith(Bot.BotSettings.Prefix) && !e.Author.IsBot) { try { await((DiscordMember)e.Author).SendMessageAsync($"{Bot.BotSettings.ErrorEmoji} Для создания приглашения в свой канал, введите команду `!invite [текст]`\n" + $"Полный гайд в закрепленных сообщениях в канале <#{Bot.BotSettings.FindChannel}>."); } catch { } } var delete = new Timer(5000); delete.Elapsed += async(sender, args) => { try { if (!e.Message.Pinned) { await e.Message.DeleteAsync(); } } catch { } delete.Stop(); delete.Close(); }; delete.Enabled = true; } } }
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); }