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); }