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