コード例 #1
0
 private async Task <IWebhook> FindExistingWebhook(ITextChannel channel)
 {
     _logger.Debug("Finding webhook for channel {Channel}", channel.Id);
     try
     {
         return((await channel.GetWebhooksAsync()).FirstOrDefault(IsWebhookMine));
     }
     catch (HttpRequestException e)
     {
         _logger.Warning(e, "Error occurred while fetching webhook list");
         // This happens sometimes when Discord returns a malformed request for the webhook list
         // Nothing we can do than just assume that none exist and return null.
         return(null);
     }
 }
コード例 #2
0
ファイル: WebhookCache.cs プロジェクト: eltariel/dmrp
        public async Task <DiscordWebhookClient> GetWebhook(ITextChannel channel, DiscordSocketClient discord)
        {
            if (!hookClients.TryGetValue(channel.Id, out var client))
            {
                var hooks = await channel.GetWebhooksAsync();

                var hook = hooks.FirstOrDefault(h => h.Creator.Id == discord.CurrentUser.Id) ??
                           await channel.CreateWebhookAsync($"DMRP Proxy Hook");

                client = new DiscordWebhookClient(hook);
                hookClients[channel.Id] = client;
            }

            return(client);
        }
コード例 #3
0
        public static async Task <ITextChannel> CloneChannelAsync(this ITextChannel channel)
        {
            var guild      = channel.Guild;
            var newChannel = await guild.CreateTextChannelAsync(channel.Name,
                                                                x =>
            {
                x.Topic      = channel.Topic;
                x.IsNsfw     = channel.IsNsfw;
                x.Position   = channel.Position;
                x.CategoryId = channel.CategoryId;
            });

            foreach (var permissionOverwrite in channel.PermissionOverwrites)
            {
                switch (permissionOverwrite.TargetType)
                {
                case PermissionTarget.Role:
                    var role = guild.GetRole(permissionOverwrite.TargetId);
                    await newChannel.AddPermissionOverwriteAsync(role, permissionOverwrite.Permissions);

                    break;

                case PermissionTarget.User:
                    var user = await guild.GetUserAsync(permissionOverwrite.TargetId);

                    await newChannel.AddPermissionOverwriteAsync(user, permissionOverwrite.Permissions);

                    break;
                }
            }

            var hooks = await channel.GetWebhooksAsync();

            foreach (var hook in hooks)
            {
                await hook.ModifyAsync(param => param.ChannelId = newChannel.Id);
            }

            await channel.DeleteAsync();

            return(newChannel);
        }
コード例 #4
0
        private async Task <DiscordWebhookClient> GetOrCreateWebhookAsync(string name, ITextChannel chan)
        {
            try
            {
                if (!CanUseWebhooks(chan))
                {
                    return(null);
                }

                IReadOnlyCollection <IWebhook> webhooks = await chan.GetWebhooksAsync();

                IWebhook webhook = webhooks.FirstOrDefault(x => x.Name == name);
                return(webhook == null ? await this.CreateWebhookAsync(name, chan) : new DiscordWebhookClient(webhook));
            }
            catch (Exception ex)
            {
                this.Logger.Nice("Webhook", ConsoleColor.Red, $"Could not get a list of webhooks: {ex.Message}");
                return(null);
            }
        }
コード例 #5
0
        public async Task <DiscordWebhookClient> GetWebhookClientAsync(ITextChannel channel)
        {
            _lock.WaitOne();
            try
            {
                if (cache.TryGetValue(channel.Id, out var correct))
                {
                    return(new DiscordWebhookClient(correct));
                }
                var hooks = await channel.GetWebhooksAsync();

                correct = hooks.FirstOrDefault(x => x.Name == _name);
                if (correct == null)
                {
                    correct = await channel.CreateWebhookAsync(_name);
                }
                cache[channel.Id] = correct;
                return(new DiscordWebhookClient(correct));
            }
            finally
            {
                _lock.Release();
            }
        }