private List <DiscordOverwriteBuilder> CreatePermissions(DiscordGuild guild, DiscordRole allowedRole, DiscordRole deniedRole) { var permissions = new List <DiscordOverwriteBuilder> (); var adminRole = guild.Roles.Values.Where(role => role.Name.Equals("smashfest-admin")).FirstOrDefault(); if (adminRole != null) { var adminPermissions = new DiscordOverwriteBuilder(); adminPermissions.For(adminRole); adminPermissions.Allow(Permissions.SendMessages); adminPermissions.Allow(Permissions.AccessChannels); adminPermissions.Allow(Permissions.PrioritySpeaker); permissions.Add(adminPermissions); } Console.WriteLine($"allowed: {allowedRole.Name}"); DiscordOverwriteBuilder allowed = new DiscordOverwriteBuilder(); allowed.For(allowedRole); allowed.Allow(Permissions.SendMessages); allowed.Allow(Permissions.AccessChannels); allowed.Allow(Permissions.ReadMessageHistory); permissions.Add(allowed); Console.WriteLine($"denied: {deniedRole.Name}"); DiscordOverwriteBuilder denied = new DiscordOverwriteBuilder(); denied.For(deniedRole); denied.Deny(Permissions.SendMessages); denied.Deny(Permissions.AccessChannels); denied.Deny(Permissions.ReadMessageHistory); permissions.Add(denied); return(permissions); }
private List <DiscordOverwriteBuilder> GetOverwrites(List <DiscordMember> v, DiscordGuild guild, DiscordMember owner) { v.Add(owner); List <DiscordOverwriteBuilder> res = new List <DiscordOverwriteBuilder>(); //@everyone - READ FALSE, WRITE FALSE DiscordOverwriteBuilder v1 = new DiscordOverwriteBuilder(); v1.For(guild.EveryoneRole); v1.Deny(Permissions.AccessChannels); v1.Deny(Permissions.SendMessages); res.Add(v1); //Frozen - WRITE FALSE DiscordOverwriteBuilder v7 = new DiscordOverwriteBuilder(); v7.For(Dependencies.Settings.FrozenPlayerRole); v7.Deny(Permissions.SendMessages); res.Add(v7); //Participant - WRITE TRUE DiscordOverwriteBuilder v2 = new DiscordOverwriteBuilder(); v2.For(Dependencies.Settings.AliveParticipantRole); v2.Allow(Permissions.SendMessages); res.Add(v2); //Dead - Read TRUE, Write FALSE DiscordOverwriteBuilder v3 = new DiscordOverwriteBuilder(); v3.For(Dependencies.Settings.DeadParticipantRole); v3.Allow(Permissions.AccessChannels); v3.Deny(Permissions.SendMessages); res.Add(v3); //GM - Read TRUE, Write True DiscordOverwriteBuilder v4 = new DiscordOverwriteBuilder(); v4.For(Dependencies.Settings.GameMasterRole); v4.Allow(Permissions.SendMessages); v4.Allow(Permissions.AccessChannels); res.Add(v4); foreach (var v5 in v) { DiscordOverwriteBuilder v6 = new DiscordOverwriteBuilder(); v6.For(v5); v6.Allow(Permissions.AccessChannels); res.Add(v6); } return(res); }
public async Task SendMessageAsync(ulong?guildId, ulong userId, string message) { try { var guild = await _guildService.GetGuild(guildId); var member = await guild.GetMemberAsync(userId); try { var channel = await member.CreateDmChannelAsync(); await channel.SendMessageAsync(message); } catch (UnauthorizedException) { var hideOverwrite = new DiscordOverwriteBuilder() .Deny(Permissions.AccessChannels) .For(member.Guild.EveryoneRole); var showOverwrite = new DiscordOverwriteBuilder() .Allow(Permissions.AccessChannels) .For(member); var readonlyOverwrite = new DiscordOverwriteBuilder() .Deny(Permissions.SendMessages) .Deny(Permissions.AddReactions) .For(member); var channel = await member.Guild.CreateChannelAsync( "message-" + member.Username, ChannelType.Text, null, overwrites : new[] { hideOverwrite, showOverwrite, readonlyOverwrite }); await channel.SendMessageAsync( "Hello, " + member .Mention + ". We tried to send you a direct message, however your direct messages are disabled for this server. Below is the message in question."); await channel.SendMessageAsync(message); } } catch (Exception e) { _logger.LogError(e, "Couldn't send message {Message} to User {UserId}", message, userId); } }
public async Task CreateChanel(CommandContext ctx, string name) { var overwrites = new DiscordOverwriteBuilder[] { new DiscordOverwriteBuilder() { Allowed = Permissions.All }.For(ctx.Member) }; var channel = await ctx.Guild.CreateChannelAsync(name, ChannelType.Voice, overwrites : overwrites, parent : BotInitSettings.GetVoiceChannelCategory(ctx.Guild)).ThrowTaskException(); await ctx.Message.DeleteAsync(); var msg = await ctx.Channel.SendMessageAsync("Канал " + name + " создан!").ThrowTaskException(); await Task.Delay(10000); await msg.DeleteAsync(); while (channel.Users.Any()) { Thread.Sleep(1); } await channel.DeleteAsync(); }
/// <summary> /// Gets all channels, members in them and set's up event handlers /// </summary> /// <param name="guild"></param> /// <returns></returns> internal async Task Initialize(DiscordGuild guild) { //DebugLogWriteLine($"Initiating {guild} GuildTask... "); //Init guild Guild = guild; GuildId = guild.Id; SecretRoomOverwriteBuilder = new DiscordOverwriteBuilder(); SecretRoomOverwriteBuilder.For(Guild.EveryoneRole); SecretRoomOverwriteBuilder.Deny(Permissions.AccessChannels); //PersonalChannelOverwriteBuilder = new DiscordOverwriteBuilder(); //PersonalChannelOverwriteBuilder.Allow(Permissions.AccessChannels); LogChannel = guild.GetChannel(LogChannelId); if (LogChannel != null) { LogMessage = await LogChannel.SendMessageAsync($"Begin of log {DateTime.Now.ToString()}\n"); } //Init RootCategory Guild.Channels.TryGetValue(DateCategoryId, out DiscordChannel cat); if (cat == null) { string m = $"Initialize failed. No Category found on + {DateCategoryId}"; //DebugLogWriteLine(m); throw new Exception(m); } DateRootCategory = cat; Guild.Channels.TryGetValue(DateSecretCategoryId, out DiscordChannel secCat); DateSecretCategory = secCat; //DebugLogWrite("Initiating voice channels... "); //VoiceChannels DateVoiceLobbies.Clear(); SecretRooms.Clear(); DateVoiceLobbies.AddRange(GetVoiceLobbies()); SecretRooms.AddRange(GetSecretRooms()); await VoiceChannelsInitAsync().ConfigureAwait(false); if (DateVoiceLobbies.Count == 0 || DateVoiceLobbies.All(c => c.Users.Count() > 0)) { await AddLastEmptyVoiceLobby().ConfigureAwait(false); } //DebugLogWrite("Initiating Emojis... "); //GetEmojis MaleEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, MaleEmojiId); FemaleEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, FemaleEmojiId); OptionEmojis.Clear(); OptionEmojis.AddRange(OptionEmojiIds.Select(id => DiscordEmoji.FromUnicode(DateBot.Instance.Client, id))); LikeEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, LikeEmojiId); DisLikeEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, DisLikeEmojiId); TimeEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, TimeEmojiId); CancelLikeEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, CancelLikeEmojiId); //DebugLogWrite("Initiating Users in lobbies... "); //Check and add users in lobbies foreach (var u in UsersInLobbies.ToArray()) { AddOrGetUserState(u).LastEnteredLobbyTime = DateTime.Now; } //DebugLogWrite("Initiating Welcome message... "); //Check for welcome message TODO add option emojis DateTextChannel = Guild.GetChannel(DateTextChannelId); await WelcomeMessageInit().ConfigureAwait(false); _ = PrivateControlsMessageInit().ConfigureAwait(false); //UpdateTimer = new Timer(TimeSpan.FromSeconds(30).TotalMilliseconds) { AutoReset = true }; //UpdateTimer.Elapsed += UpdateTimer_Elapsed; //UpdateTimer.Start(); //DebugLogWrite("finished"); InitTask = null; Initialized = true; if (UsersInLobbies.Count > 0) { TryStartMatchingTask(); } }
public async Task CreateTeamGame(CommandContext ctx, string gameName, int targetMemberCount, string description) { var channel = BotInitSettings.GetTeamFindingChannel(ctx.Guild); var msg = await channel.SendMessageAsync(ctx.Member.Mention + " ищет напарника(ов) для игры в " + gameName + "\n" + "Доп. иформация: " + description + (targetMemberCount == -1 ? "" : ("\n\n" + "Для игры нужно " + targetMemberCount + " человек(а)"))); await msg.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":ok_hand:")); if (targetMemberCount == -1) { await msg.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":arrow_forward:")); } await ctx.Message.DeleteAsync(); var interact = ctx.Client.GetInteractivity(); var dm = await ctx.Member.CreateDmChannelAsync(); List <DiscordUser> userList; if (targetMemberCount != -1) { while (true) { Func <MessageReactionAddEventArgs, bool> predecate = (s) => s.Message == msg && s.Emoji == DiscordEmoji.FromName(ctx.Client, ":ok_hand:"); await interact.WaitForReactionAsync(predecate); var users = await msg.GetReactionsAsync(DiscordEmoji.FromName(ctx.Client, ":ok_hand:")); if (users.Count - 1 >= targetMemberCount) { userList = users.Where((s, i) => 0 <= i && i <= targetMemberCount - 1).ToList(); //Bot reaction ignore await dm.SendMessageAsync("Ваша игра готова к старту! Зайдите в канал и одобрите старт!"); await msg.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":arrow_forward:")); var retry = true; while (retry) { retry = (await interact.WaitForReactionAsync (s => s.Message == msg && s.User == ctx.User && s.Emoji == DiscordEmoji.FromName(ctx.Client, ":arrow_forward:"))).TimedOut; } break; } } } else { Func <MessageReactionAddEventArgs, bool> predecate = (s) => s.Message == msg && s.Emoji == DiscordEmoji.FromName(ctx.Client, ":arrow_forward:"); var retry = true; while (retry) { retry = (await interact.WaitForReactionAsync (s => s.Message == msg && s.Emoji == DiscordEmoji.FromName(ctx.Client, ":arrow_forward:"), new TimeSpan(0, 10, 0))).TimedOut; await dm.SendMessageAsync("Незабывайте про созданую игру. Возможно уже пора начинать!"); } var users = await msg.GetReactionsAsync(DiscordEmoji.FromName(ctx.Client, ":ok_hand:")); userList = users.Where((s, i) => 0 <= i && i <= targetMemberCount - 1).ToList(); //Bot reaction ignore } var msg2 = await channel.SendMessageAsync("Игра в " + gameName + " запущена!" + "\n\n" + "Участники: " + string.Join(", ", userList.Select(s => s.Mention))); var name = "Играем в " + gameName; var overwrites = new DiscordOverwriteBuilder[] { new DiscordOverwriteBuilder() { Allowed = Permissions.All }.For(ctx.Member) }; var voiceChannel = await ctx.Guild.CreateChannelAsync(name, ChannelType.Voice, overwrites : overwrites, parent : BotInitSettings.GetVoiceChannelCategory(ctx.Guild)).ThrowTaskException(); var deleteTask = Task.Run(() => { Thread.Sleep(10000); while (voiceChannel.Users.Any()) { Thread.Sleep(1); } voiceChannel.DeleteAsync(); }); await Task.Delay(3000); await msg.DeleteAsync(); await Task.Delay(120000); await msg2.DeleteAsync(); await deleteTask; }