public async Task Invite(CommandContext ctx, [Description("Участник")] DiscordMember member) { var ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null || ship.GetCaptain().Status == false) { await ctx.RespondAsync( $"{Bot.BotSettings.ErrorEmoji} Ты не являешься владельцем корабля или твой запрос ещё не был подтвержден."); return; } if (ship.GetMembers().Any(m => m.MemberId == member.Id)) { await ctx.RespondAsync( $"{Bot.BotSettings.ErrorEmoji} Пользователь уже приглашен или является участником корабля."); return; } ship.AddMember(member.Id, PrivateShipMemberRole.Member, false); try { await member.SendMessageAsync( $"Ты был приглашён присоединиться к кораблю **{ship.Name}**. Используй в канале для команд " + $"`!p yes {ship.Name}`, чтобы принять приглашение, или `!p no {ship.Name}`, чтобы отклонить его."); } catch (UnauthorizedException) { } await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Приглашение успешно отправлено."); }
public async Task No(CommandContext ctx, [Description("Корабль")][RemainingText] string name) { var ship = PrivateShip.Get(name); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Этот корабль не был найден."); return; } var selectedMembers = (from member in ship.GetMembers() where member.MemberId == ctx.Member.Id select member).ToList(); if (!selectedMembers.Any()) { await ctx.RespondAsync( $"{Bot.BotSettings.ErrorEmoji} Ты не был приглашён присоединиться к этому кораблю."); return; } ship.RemoveMember(ctx.Member.Id); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Ты успешно отклонил приглашение."); }
public async Task Invite(CommandContext ctx, [Description("Участник")] DiscordMember member, [Description("Корабль (необязательно для капитанов)")] [RemainingText] string shipName) { PrivateShip ship = null; if (string.IsNullOrEmpty(shipName)) { ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься капитаном. Офицеры могут использовать команду " + $"`!p invite участник название корабля`"); return; } } else { ship = PrivateShip.Get(shipName); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Указанный корабль не был найден!"); return; } } var requesterMember = ship.GetMember(ctx.Member.Id); if (requesterMember == null || (requesterMember.Role != PrivateShipMemberRole.Officer && requesterMember.Role != PrivateShipMemberRole.Captain)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься офицером или капитаном на данном корабле"); return; } if (ship.GetMembers().Any(m => m.MemberId == member.Id)) { await ctx.RespondAsync( $"{Bot.BotSettings.ErrorEmoji} Пользователь уже приглашен или является участником корабля."); return; } ship.AddMember(member.Id, PrivateShipMemberRole.Member, false); try { await member.SendMessageAsync( $":envelope: Ты был приглашён присоединиться к кораблю **{ship.Name}**. Используй в канале для команд " + $"`!p yes {ship.Name}`, чтобы принять приглашение, или `!p no {ship.Name}`, чтобы отклонить его."); } catch (UnauthorizedException) { } await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Приглашение успешно отправлено."); }
public async Task New(CommandContext ctx, [Description("Уникальное имя корабля")][RemainingText] string name) { // check if user already has a ship if (PrivateShip.GetOwnedShip(ctx.Member.Id) != null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты уже являешься владельцем корабля."); return; } var requestTime = DateTime.Now; // check if the ship name is not set if (string.IsNullOrEmpty(name)) { await ctx.RespondAsync( $"{Bot.BotSettings.ErrorEmoji} Ты не указал имя корабля: `!p new название корабля`"); return; } // check if there is a ship with the same name if (PrivateShip.Get(name) != null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Корабль с таким именем уже существует."); return; } // create a new ship var ship = PrivateShip.Create(name, requestTime, 0); ship.AddMember(ctx.Member.Id, PrivateShipMemberRole.Captain, false); // create a request message var requestsChannel = ctx.Guild.GetChannel(Bot.BotSettings.PrivateRequestsChannel); var requestText = "**Запрос на создание корабля**\n\n" + $"**От:** {ctx.Member.Mention} ({ctx.Member.Id})\n" + $"**Название:** {name}\n" + $"**Время:** {DateTime.Now}\n\n" + $"Используйте :white_check_mark: для подтверждения или :no_entry: для отказа."; var message = await requestsChannel.SendMessageAsync(requestText); await message.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":white_check_mark:")); await message.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":no_entry:")); ship.RequestMessage = message.Id; // notify user await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Запрос успешно отправлен"); }
public static async Task PrivateOnVoiceStateUpdated(DiscordClient client, VoiceStateUpdateEventArgs e) { if (e.Channel != null && e.Channel.ParentId == Bot.BotSettings.PrivateCategory) { var ship = PrivateShip.GetByChannel(e.Channel.Id); if (ship != null) { ship.LastUsed = DateTime.Now; } } await Task.CompletedTask; }
private static string GetPrivateShip(ulong userId) { var ship = PrivateShip.GetOwnedShip(userId); if (ship == null) { return(null); } else { return(ship.Name); } }
public async Task Kick(CommandContext ctx, [Description("Участник")] DiscordMember member) { var ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься владельцем корабля."); return; } if (ctx.Member == member) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Нельзя выгнать самого себя."); return; } var members = ship.GetMembers(); var selected = members.Find(m => m.MemberId == member.Id); if (selected == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Этого участника нет на корабле."); return; } ship.RemoveMember(selected.MemberId); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Ты успешно выгнал участника с корабля."); try { if (selected.Status) { await ctx.Guild.GetChannel(ship.Channel).AddOverwriteAsync(member); await member.SendMessageAsync($"Капитан **{ctx.Member.DisplayName}#{ctx.Member.Discriminator}** " + $"выгнал тебя с корабля **{ship.Name}**"); } else { await member.SendMessageAsync($"Капитан **{ctx.Member.DisplayName}#{ctx.Member.Discriminator}** " + $"отменил твоё приглашение на корабль **{ship.Name}**"); } } catch (UnauthorizedException) { } }
//private static async void ClearSubscriptionsOnElapsed(object sender, ElapsedEventArgs e) //{ // Client.Logger.LogDebug(BotLoggerEvents.Timers, $"ClearSubscriptionsOnElapsed running"); // for (int i = 0; i < Subscriber.Subscribers.Count; ++i) // { // var sub = Subscriber.Subscribers.Values.ToArray()[i]; // if (DateTime.Now > sub.SubscriptionEnd) // { // try // { // var guild = Client.Guilds[Bot.BotSettings.Guild]; // var member = await guild.GetMemberAsync(sub.Member); // try // { // if (member != null) // { // await member.SendMessageAsync("Ваша подписка истекла :cry:"); // } // } // catch (NotFoundException) { } // catch (ArgumentException) { } // try // { // await DonatorCommands.DeletePrivateRoleAsync(guild, member.Id); // } // catch (Exceptions.NotFoundException) { } // Subscriber.Subscribers.Remove(sub.Member); // Subscriber.Save(Bot.BotSettings.SubscriberXML); // } // catch (Exception ex) // { // Client.Logger.LogError(BotLoggerEvents.Timers, ex, $"Возникла ошибка при очистке подписок."); // } // } // } //} private static async void DeleteShipsOnElapsed(object sender, ElapsedEventArgs e) { Client.Logger.LogDebug(BotLoggerEvents.Timers, $"DeleteShipsOnElapsed running"); foreach (var ship in PrivateShip.GetAll()) { if ((DateTime.Now - ship.LastUsed).Days >= 3) { try { var guild = await Client.GetGuildAsync(Bot.BotSettings.Guild); try { var channel = guild.GetChannel(ship.Channel); await channel.DeleteAsync(); } catch (NotFoundException) { } try { var member = await guild.GetMemberAsync(ship.GetCaptain().MemberId); await member.SendMessageAsync($"Твой корабль **{ship.Name}** был удалён из-за неактивности."); } catch (UnauthorizedException) { } catch (NotFoundException) { } PrivateShip.Delete(ship.Name); await guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync("**Удаление корабля**\n\n" + $"**Модератор:** {Client.CurrentUser}\n" + $"**Название:** {ship.Name}\n" + $"**Дата:** {DateTime.Now}"); } catch (NullReferenceException ex) { Client.Logger.LogError(BotLoggerEvents.Timers, $"DeleteShipsOnElapsed Ship: {ship.Name} Channel: {ship.Channel} {ex.Message}"); } } } }
public async Task Transfer(CommandContext ctx, [Description("Новый капитан")] DiscordMember member) { var ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься владельцем корабля"); return; } if (ctx.Member == member) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Нельзя передать права самому себе"); return; } var members = ship.GetMembers(); var oldCaptain = members.Find(m => m.Role == PrivateShipMemberRole.Captain); var newCaptain = members.Find(m => m.MemberId == member.Id); if (newCaptain == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Нельзя передать права пользователю, которого нет на твоём корабле"); return; } newCaptain.Role = PrivateShipMemberRole.Captain; if (oldCaptain != null) { oldCaptain.Role = PrivateShipMemberRole.Member; } await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Ты успешно передал должность капитана"); try { await member.SendMessageAsync($"Ты был назначен капитаном корабля **{ship.Name}**"); return; } catch (UnauthorizedException) { } }
public async Task List(CommandContext ctx) { var ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Вы не являетесь владельцем корабля!"); return; } var members = ship.GetMembers().OrderByDescending(m => m.Role).ToList(); await ctx.Channel.TriggerTypingAsync(); var memberList = new List <string>(); foreach (var member in members) { DiscordMember discordMember = null; try { discordMember = await ctx.Guild.GetMemberAsync(member.MemberId); } catch (NotFoundException) { continue; } var type = PrivateShipMember.RoleEnumToStringRu(member.Role); memberList.Add($"{type} {discordMember.DisplayName}#{discordMember.Discriminator}."); } var interactivity = ctx.Client.GetInteractivity(); var membersPagination = Utility.GeneratePagesInEmbeds(memberList, $"Список членов экипажа вашего корабля."); if (memberList.Count() > 1) { await interactivity.SendPaginatedMessageAsync(ctx.Channel, ctx.User, membersPagination, timeoutoverride : TimeSpan.FromMinutes(5)); } else { await ctx.RespondAsync(embed : membersPagination.First().Embed); } }
public async Task Rename(CommandContext ctx, [RemainingText][Description("Новое название")] string name) { var ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься владельцем корабля"); return; } ship.Name = name; name = "☠" + name + "☠"; await ctx.Guild.GetChannel(ship.Channel).ModifyAsync(x => x.Name = name); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Успешно переименован корабль"); }
public async Task FDelete(CommandContext ctx, [RemainingText] string name) { var ship = PrivateShip.Get(name); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Не был найден корабль с указанным именем"); return; } try { await ctx.Guild.GetChannel(ship.Channel).DeleteAsync(); } catch (NotFoundException) { // channel not found } try { var owner = await ctx.Guild.GetMemberAsync(ship.GetCaptain().MemberId); await owner.SendMessageAsync( $"Твой корабль **{ship.Name}** был удалён модератором **{ctx.Member.DisplayName}#{ctx.Member.Discriminator}**"); } catch (NotFoundException) { } catch (UnauthorizedException) { } PrivateShip.Delete(ship.Name); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Корабль успешно удалён"); await ctx.Guild.GetChannel(Bot.BotSettings.ModlogChannel).SendMessageAsync("**Удаление корабля**\n\n" + $"**Модератор:** {ctx.Member}\n" + $"**Название:** {ship.Name}\n" + $"**Дата:** {DateTime.Now}"); }
public async Task Leave(CommandContext ctx, [Description("Корабль")][RemainingText] string name) { var ship = PrivateShip.Get(name); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Корабль не был найден."); return; } var shipMember = ship.GetMembers().Find(m => m.MemberId == ctx.Member.Id); if (shipMember == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься участником этого корабля."); return; } if (shipMember.Role == PrivateShipMemberRole.Captain) { await ctx.RespondAsync( $"{Bot.BotSettings.ErrorEmoji} Прежде чем покинуть корабль, передай полномочия " + $"капитана с помощью команды `!p transfer @участник`."); return; } ship.RemoveMember(ctx.Member.Id); if (shipMember.Status) { await ctx.Guild.GetChannel(ship.Channel).AddOverwriteAsync(ctx.Member); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Ты покинул корабль **{ship.Name}**."); } else { await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Ты успешно отклонил приглашение присоединиться к кораблю."); } }
public async Task Demote(CommandContext ctx, [Description("Офицер")] DiscordMember member) { var ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься капитаном корабля"); return; } // check if the specified member is a ship member var shipMember = ship.GetMember(member.Id); if (shipMember == null || !shipMember.Status) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Этого участника нет на корабле"); return; } // check if the specified member is not an officer if (shipMember.Role != PrivateShipMemberRole.Officer) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Участник не является офицером"); return; } shipMember.Role = PrivateShipMemberRole.Member; try { await member.SendMessageAsync($":arrow_down: Ты был снят с должности офицера на корабле **{ship.Name}**"); } catch (UnauthorizedException) { } await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Участник был снят с должности офицера"); }
public async Task Promote(CommandContext ctx, [Description("Новый офицер")] DiscordMember member) { var ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься капитаном корабля"); return; } // check if the specified member is a ship member var shipMember = ship.GetMember(member.Id); if (shipMember == null || !shipMember.Status) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Нельзя назначить офицером пользователя, которого нет на корабле"); return; } // check if the specified member is not an officer already if (shipMember.Role == PrivateShipMemberRole.Officer) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Пользователь уже является офицером"); return; } shipMember.Role = PrivateShipMemberRole.Officer; try { await member.SendMessageAsync($":arrow_up: Ты был назначен офицером на корабле **{ship.Name}**"); } catch (UnauthorizedException) { } await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Участник был успешно назначен офицером"); }
public async Task Yes(CommandContext ctx, [Description("Корабль")][RemainingText] string name) { var ship = PrivateShip.Get(name); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Этот корабль не был найден."); return; } var selectedMembers = (from member in ship.GetMembers() where member.MemberId == ctx.Member.Id select member).ToList(); if (!selectedMembers.Any()) { await ctx.RespondAsync( $"{Bot.BotSettings.ErrorEmoji} Ты не был приглашён присоединиться к этому кораблю."); return; } var shipMember = selectedMembers.First(); if (shipMember.Status) { await ctx.RespondAsync( $"{Bot.BotSettings.ErrorEmoji} Ты уже являешься участником этого корабля."); return; } shipMember.Status = true; await ctx.Guild.GetChannel(ship.Channel).AddOverwriteAsync(ctx.Member, Permissions.UseVoice); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Добро пожаловать на борт корабля **{name}**!"); }
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); }
public async Task List(CommandContext ctx, [Description("Название корабля (необязательно для капитанов)")][RemainingText] string shipName = null) { PrivateShip ship = null; if (string.IsNullOrEmpty(shipName)) { ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься капитаном. Офицеры могут использовать команду " + $"`!p list название корабля`"); return; } } else { ship = PrivateShip.Get(shipName); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Указанный корабль не был найден!"); return; } } var requesterMember = ship.GetMember(ctx.Member.Id); if (requesterMember == null || (requesterMember.Role != PrivateShipMemberRole.Officer && requesterMember.Role != PrivateShipMemberRole.Captain)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься офицером или капитаном на данном корабле"); return; } var members = ship.GetMembers().OrderByDescending(m => m.Role).ToList(); await ctx.Channel.TriggerTypingAsync(); var memberList = new List <string>(); foreach (var member in members) { DiscordMember discordMember = null; try { discordMember = await ctx.Guild.GetMemberAsync(member.MemberId); } catch (NotFoundException) { continue; } var type = PrivateShipMember.RoleEnumToStringRu(member.Role); memberList.Add($"{type} {discordMember.DisplayName}#{discordMember.Discriminator}." + (member.Status ? null : " Приглашён.")); } var interactivity = ctx.Client.GetInteractivity(); var membersPagination = Utility.GeneratePagesInEmbeds(memberList, $"Список членов экипажа вашего корабля."); if (memberList.Count() > 1) { //await interactivity.SendPaginatedMessageAsync(ctx.Channel, ctx.User, membersPagination, timeoutoverride: TimeSpan.FromMinutes(5)); await interactivity.SendPaginatedMessageAsync( channel : await ctx.Member.CreateDmChannelAsync(), user : ctx.User, pages : membersPagination, behaviour : PaginationBehaviour.Ignore, deletion : ButtonPaginationBehavior.DeleteButtons, token : default);
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 Kick(CommandContext ctx, [Description("Участник")] DiscordMember member, [RemainingText][Description("Название корабля (необязательно для капитанов)")] string shipName) { PrivateShip ship = null; if (string.IsNullOrEmpty(shipName)) { ship = PrivateShip.GetOwnedShip(ctx.Member.Id); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься капитаном. Офицеры могут использовать команду " + $"`!p kick участник название корабля`"); return; } } else { ship = PrivateShip.Get(shipName); if (ship == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Указанный корабль не был найден!"); return; } } var requesterMember = ship.GetMember(ctx.Member.Id); if (requesterMember == null || (requesterMember.Role != PrivateShipMemberRole.Officer && requesterMember.Role != PrivateShipMemberRole.Captain)) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Ты не являешься офицером или капитаном на данном корабле"); return; } if (ctx.Member == member) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Нельзя выгнать самого себя."); return; } var members = ship.GetMembers(); var selected = members.Find(m => m.MemberId == member.Id); if (selected == null) { await ctx.RespondAsync($"{Bot.BotSettings.ErrorEmoji} Этого участника нет на корабле."); return; } ship.RemoveMember(selected.MemberId); await ctx.RespondAsync($"{Bot.BotSettings.OkEmoji} Ты успешно выгнал участника с корабля."); try { string title = requesterMember.Role == PrivateShipMemberRole.Captain ? "Капитан" : "Офицер"; if (selected.Status) { await ctx.Guild.GetChannel(ship.Channel).AddOverwriteAsync(member); await member.SendMessageAsync($":right_facing_fist: {title} **{ctx.Member.DisplayName}#{ctx.Member.Discriminator}** " + $"выгнал тебя с корабля **{ship.Name}**"); } else { await member.SendMessageAsync($":right_facing_fist: {title} **{ctx.Member.DisplayName}#{ctx.Member.Discriminator}** " + $"отменил твоё приглашение на корабль **{ship.Name}**"); } } catch (UnauthorizedException) { } }