Logging almost done
This commit is contained in:
		| @@ -33,170 +33,8 @@ | ||||
| //            NadekoBot.Client.ChannelDestroyed += ChannelDestroyed; | ||||
| //            NadekoBot.Client.ChannelUpdated += ChannelUpdated; | ||||
|  | ||||
|  | ||||
| //            NadekoBot.Client.MessageReceived += async (s, e) => | ||||
| //            { | ||||
| //                if (e.Channel.IsPrivate || umsg.Author.Id == NadekoBot.Client.CurrentUser.Id) | ||||
| //                    return; | ||||
| //                if (!SpecificConfigurations.Default.Of(e.Server.Id).SendPrivateMessageOnMention) return; | ||||
| //                try | ||||
| //                { | ||||
| //                    var usr = e.Message.MentionedUsers.FirstOrDefault(u => u != umsg.Author); | ||||
| //                    if (usr?.Status != UserStatus.Offline) | ||||
| //                        return; | ||||
| //                    await channel.SendMessageAsync($"User `{usr.Name}` is offline. PM sent.").ConfigureAwait(false); | ||||
| //                    await usr.SendMessageAsync( | ||||
| //                        $"User `{umsg.Author.Username}` mentioned you on " + | ||||
| //                        $"`{e.Server.Name}` server while you were offline.\n" + | ||||
| //                        $"`Message:` {e.Message.Text}").ConfigureAwait(false); | ||||
| //                } | ||||
| //                catch { } | ||||
| //            }; | ||||
|  | ||||
| //            // start the userpresence queue | ||||
|  | ||||
| //            NadekoBot.OnReady += () => Task.Run(async () => | ||||
| //             { | ||||
| //                 while (true) | ||||
| //                 { | ||||
| //                     var toSend = new Dictionary<Channel, string>(); | ||||
| //                     //take everything from the queue and merge the messages which are going to the same channel | ||||
| //                     KeyValuePair<Channel, string> item; | ||||
| //                     while (voicePresenceUpdates.TryTake(out item)) | ||||
| //                     { | ||||
| //                         if (toSend.ContainsKey(item.Key)) | ||||
| //                         { | ||||
| //                             toSend[item.Key] = toSend[item.Key] + Environment.NewLine + item.Value; | ||||
| //                         } | ||||
| //                         else | ||||
| //                         { | ||||
| //                             toSend.Add(item.Key, item.Value); | ||||
| //                         } | ||||
| //                     } | ||||
| //                     //send merged messages to each channel | ||||
| //                     foreach (var k in toSend) | ||||
| //                     { | ||||
| //                         try { await k.Key.SendMessageAsync(Environment.NewLine + k.Value).ConfigureAwait(false); } catch { } | ||||
| //                     } | ||||
|  | ||||
| //                     await Task.Delay(5000); | ||||
| //                 } | ||||
| //             }); | ||||
| //        } | ||||
|  | ||||
| //        private async void ChannelUpdated(object sender, ChannelUpdatedEventArgs e) | ||||
| //        { | ||||
| //            try | ||||
| //            { | ||||
| //                var config = SpecificConfigurations.Default.Of(e.Server.Id); | ||||
| //                var chId = config.LogServerChannel; | ||||
| //                if (chId == null || config.LogserverIgnoreChannels.Contains(e.After.Id)) | ||||
| //                    return; | ||||
| //                Channel ch; | ||||
| //                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) | ||||
| //                    return; | ||||
| //                if (e.Before.Name != e.After.Name) | ||||
| //                    await ch.SendMessageAsync($@"`{prettyCurrentTime}` **Channel Name Changed** `#{e.Before.Name}` (*{e.After.Id}*) | ||||
| //        `New:` {e.After.Name}").ConfigureAwait(false); | ||||
| //                else if (e.Before.Topic != e.After.Topic) | ||||
| //                    await ch.SendMessageAsync($@"`{prettyCurrentTime}` **Channel Topic Changed** `#{e.After.Name}` (*{e.After.Id}*) | ||||
| //        `Old:` {e.Before.Topic} | ||||
| //        `New:` {e.After.Topic}").ConfigureAwait(false); | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
|  | ||||
| //        private async void ChannelDestroyed(object sender, ChannelEventArgs e) | ||||
| //        { | ||||
| //            try | ||||
| //            { | ||||
| //                var config = SpecificConfigurations.Default.Of(e.Server.Id); | ||||
| //                var chId = config.LogServerChannel; | ||||
| //                if (chId == null || config.LogserverIgnoreChannels.Contains(e.Channel.Id)) | ||||
| //                    return; | ||||
| //                Channel ch; | ||||
| //                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) | ||||
| //                    return; | ||||
| //                await ch.SendMessageAsync($"❗`{prettyCurrentTime}`❗`Channel Deleted:` #{e.Channel.Name} (*{e.Channel.Id}*)").ConfigureAwait(false); | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
|  | ||||
| //        private async void ChannelCreated(object sender, ChannelEventArgs e) | ||||
| //        { | ||||
| //            try | ||||
| //            { | ||||
| //                var config = SpecificConfigurations.Default.Of(e.Server.Id); | ||||
| //                var chId = config.LogServerChannel; | ||||
| //                if (chId == null || config.LogserverIgnoreChannels.Contains(e.Channel.Id)) | ||||
| //                    return; | ||||
| //                Channel ch; | ||||
| //                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) | ||||
| //                    return; | ||||
| //                await ch.SendMessageAsync($"`{prettyCurrentTime}`🆕`Channel Created:` #{e.Channel.Mention} (*{e.Channel.Id}*)").ConfigureAwait(false); | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
|  | ||||
| //        private async void UsrUnbanned(object sender, UserEventArgs e) | ||||
| //        { | ||||
| //            try | ||||
| //            { | ||||
| //                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; | ||||
| //                if (chId == null) | ||||
| //                    return; | ||||
| //                Channel ch; | ||||
| //                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) | ||||
| //                    return; | ||||
| //                await ch.SendMessageAsync($"`{prettyCurrentTime}`♻`User was unbanned:` **{umsg.Author.Username}** ({umsg.Author.Id})").ConfigureAwait(false); | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
|  | ||||
| //        private async void UsrJoined(object sender, UserEventArgs e) | ||||
| //        { | ||||
| //            try | ||||
| //            { | ||||
| //                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; | ||||
| //                if (chId == null) | ||||
| //                    return; | ||||
| //                Channel ch; | ||||
| //                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) | ||||
| //                    return; | ||||
| //                await ch.SendMessageAsync($"`{prettyCurrentTime}`✅`User joined:` **{umsg.Author.Username}** ({umsg.Author.Id})").ConfigureAwait(false); | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
|  | ||||
| //        private async void UsrLeft(object sender, UserEventArgs e) | ||||
| //        { | ||||
| //            try | ||||
| //            { | ||||
| //                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; | ||||
| //                if (chId == null) | ||||
| //                    return; | ||||
| //                Channel ch; | ||||
| //                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) | ||||
| //                    return; | ||||
| //                await ch.SendMessageAsync($"`{prettyCurrentTime}`❗`User left:` **{umsg.Author.Username}** ({umsg.Author.Id})").ConfigureAwait(false); | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
|  | ||||
| //        private async void UsrBanned(object sender, UserEventArgs e) | ||||
| //        { | ||||
| //            try | ||||
| //            { | ||||
| //                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; | ||||
| //                if (chId == null) | ||||
| //                    return; | ||||
| //                Channel ch; | ||||
| //                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) | ||||
| //                    return; | ||||
| //                await ch.SendMessageAsync($"❗`{prettyCurrentTime}`❌`User banned:` **{umsg.Author.Username}** ({umsg.Author.Id})").ConfigureAwait(false); | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
|  | ||||
| //        private async void MsgRecivd(object sender, MessageEventArgs e) | ||||
| //        { | ||||
| @@ -226,112 +64,9 @@ | ||||
|  | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
| //        private async void MsgDltd(object sender, MessageEventArgs e) | ||||
| //        { | ||||
| //            try | ||||
| //            { | ||||
| //                if (e.Server == null || e.Channel.IsPrivate || umsg.Author?.Id == NadekoBot.Client.CurrentUser.Id) | ||||
| //                    return; | ||||
| //                var config = SpecificConfigurations.Default.Of(e.Server.Id); | ||||
| //                var chId = config.LogServerChannel; | ||||
| //                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id)) | ||||
| //                    return; | ||||
| //                Channel ch; | ||||
| //                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) | ||||
| //                    return; | ||||
| //                if (!string.IsNullOrWhiteSpace(e.Message.Text)) | ||||
| //                { | ||||
| //                    await ch.SendMessageAsync( | ||||
| //        $@"🕔`{prettyCurrentTime}` **Message** 🚮 `#{e.Channel.Name}` | ||||
| //👤`{umsg.Author?.ToString() ?? ("NULL")}` {e.Message.Text.Unmention()}").ConfigureAwait(false); | ||||
| //                } | ||||
| //                else | ||||
| //                { | ||||
| //                    await ch.SendMessageAsync( | ||||
| //        $@"🕔`{prettyCurrentTime}` **File Deleted** `#{e.Channel.Name}` | ||||
| //👤`{umsg.Author?.ToString() ?? ("NULL")}` {e.Message.Attachments.FirstOrDefault()?.ProxyUrl}").ConfigureAwait(false); | ||||
| //                } | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
| //        private async void MsgUpdtd(object sender, MessageUpdatedEventArgs e) | ||||
| //        { | ||||
| //            try | ||||
| //            { | ||||
| //                if (e.Server == null || e.Channel.IsPrivate || umsg.Author?.Id == NadekoBot.Client.CurrentUser.Id) | ||||
| //                    return; | ||||
| //                var config = SpecificConfigurations.Default.Of(e.Server.Id); | ||||
| //                var chId = config.LogServerChannel; | ||||
| //                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id)) | ||||
| //                    return; | ||||
| //                Channel ch; | ||||
| //                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) | ||||
| //                    return; | ||||
| //                await ch.SendMessageAsync( | ||||
| //        $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}` | ||||
| //👤`{umsg.Author?.ToString() ?? ("NULL")}` | ||||
| //        `Old:` {e.Before.Text.Unmention()} | ||||
| //        `New:` {e.After.Text.Unmention()}").ConfigureAwait(false); | ||||
| //            } | ||||
| //            catch { } | ||||
| //        } | ||||
|  | ||||
| //        private async void UsrUpdtd(object sender, UserUpdatedEventArgs e) | ||||
| //        { | ||||
| //            var config = SpecificConfigurations.Default.Of(e.Server.Id); | ||||
| //            try | ||||
| //            { | ||||
| //                var chId = config.LogPresenceChannel; | ||||
| //                if (chId != null) | ||||
| //                { | ||||
| //                    Channel ch; | ||||
| //                    if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) != null) | ||||
| //                    { | ||||
| //                        if (e.Before.Status != e.After.Status) | ||||
| //                        { | ||||
| //                            voicePresenceUpdates.Add(new KeyValuePair<Channel, string>(ch, $"`{prettyCurrentTime}`**{e.Before.Name}** is now **{e.After.Status}**.")); | ||||
| //                        } | ||||
| //                    } | ||||
| //                } | ||||
| //            } | ||||
| //            catch { } | ||||
|  | ||||
| //            try | ||||
| //            { | ||||
| //                ulong notifyChBeforeId; | ||||
| //                ulong notifyChAfterId; | ||||
| //                Channel notifyChBefore = null; | ||||
| //                Channel notifyChAfter = null; | ||||
| //                var beforeVch = e.Before.VoiceChannel; | ||||
| //                var afterVch = e.After.VoiceChannel; | ||||
| //                var notifyLeave = false; | ||||
| //                var notifyJoin = false; | ||||
| //                if ((beforeVch != null || afterVch != null) && (beforeVch != afterVch)) // this means we need to notify for sure. | ||||
| //                { | ||||
| //                    if (beforeVch != null && config.VoiceChannelLog.TryGetValue(beforeVch.Id, out notifyChBeforeId) && (notifyChBefore = e.Before.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChBeforeId)) != null) | ||||
| //                    { | ||||
| //                        notifyLeave = true; | ||||
| //                    } | ||||
| //                    if (afterVch != null && config.VoiceChannelLog.TryGetValue(afterVch.Id, out notifyChAfterId) && (notifyChAfter = e.After.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChAfterId)) != null) | ||||
| //                    { | ||||
| //                        notifyJoin = true; | ||||
| //                    } | ||||
| //                    if ((notifyLeave && notifyJoin) && (notifyChAfter == notifyChBefore)) | ||||
| //                    { | ||||
| //                        await notifyChAfter.SendMessageAsync($"🎼`{prettyCurrentTime}` {e.Before.Name} moved from **{beforeVch.Mention}** to **{afterVch.Mention}** voice channel.").ConfigureAwait(false); | ||||
| //                    } | ||||
| //                    else if (notifyJoin) | ||||
| //                    { | ||||
| //                        await notifyChAfter.SendMessageAsync($"🎼`{prettyCurrentTime}` {e.Before.Name} has joined **{afterVch.Mention}** voice channel.").ConfigureAwait(false); | ||||
| //                    } | ||||
| //                    else if (notifyLeave) | ||||
| //                    { | ||||
| //                        await notifyChBefore.SendMessageAsync($"🎼`{prettyCurrentTime}` {e.Before.Name} has left **{beforeVch.Mention}** voice channel.").ConfigureAwait(false); | ||||
| //                    } | ||||
| //                } | ||||
| //            } | ||||
| //            catch { } | ||||
|  | ||||
| //            try | ||||
| //            { | ||||
| //                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; | ||||
|   | ||||
| @@ -29,12 +29,14 @@ namespace NadekoBot.Modules.Administration | ||||
|  | ||||
|             public ConcurrentDictionary<ulong, LogSetting> GuildLogSettings { get; } | ||||
|  | ||||
|             private ConcurrentDictionary<ITextChannel, List<string>> UserPresenceUpdates { get; } | ||||
|             private ConcurrentDictionary<ITextChannel, List<string>> UserPresenceUpdates { get; } = new ConcurrentDictionary<ITextChannel, List<string>>(); | ||||
|             private Timer t; | ||||
|             private IGoogleApiService _google { get; } | ||||
|  | ||||
|             public LogCommands(DiscordSocketClient client) | ||||
|             public LogCommands(DiscordSocketClient client, IGoogleApiService google) | ||||
|             { | ||||
|                 _client = client; | ||||
|                 _google = google; | ||||
|                 _log = LogManager.GetCurrentClassLogger(); | ||||
|  | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
| @@ -50,11 +52,8 @@ namespace NadekoBot.Modules.Administration | ||||
|                     foreach (var key in keys) | ||||
|                     { | ||||
|                         List<string> messages; | ||||
|                         UserPresenceUpdates.TryRemove(key, out messages); | ||||
|                         foreach (var msg in messages) | ||||
|                         { | ||||
|                             await key.SendMessageAsync(msg); | ||||
|                         } | ||||
|                         if (UserPresenceUpdates.TryRemove(key, out messages)) | ||||
|                             try { await key.SendMessageAsync(string.Join(Environment.NewLine, messages)); } catch { } //502/403 | ||||
|                     } | ||||
|                 }, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)); | ||||
|                  | ||||
| @@ -68,18 +67,61 @@ namespace NadekoBot.Modules.Administration | ||||
|                 _client.UserLeft += _client_UserLeft; | ||||
|                 _client.UserPresenceUpdated += _client_UserPresenceUpdated; | ||||
|                 _client.UserVoiceStateUpdated += _client_UserVoiceStateUpdated; | ||||
|                 _client.UserUpdated += _client_UserUpdated; | ||||
|  | ||||
|                 _client.ChannelCreated += _client_ChannelCreated; | ||||
|                 _client.ChannelDestroyed += _client_ChannelDestroyed; | ||||
|                 _client.ChannelUpdated += _client_ChannelUpdated; | ||||
|             } | ||||
|  | ||||
|             private Task _client_UserUpdated(IGuildUser before, IGuildUser after) | ||||
|             { | ||||
|                 LogSetting logSetting; | ||||
|                 if (!GuildLogSettings.TryGetValue(before.Guild.Id, out logSetting) | ||||
|                     || !logSetting.IsLogging | ||||
|                     || !logSetting.UserUpdated) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = TryGetLogChannel(before.Guild, logSetting)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
|                 { | ||||
|                     string str = $"🕔`{prettyCurrentTime}`"; | ||||
|                     if (before.Username != after.Username) | ||||
|                         str += $"**Name Changed**👤`{before.Username}#{before.Discriminator}`\n\t\t`New:`{after.ToString()}`"; | ||||
|                     else if (before.Nickname != after.Nickname) | ||||
|                         str += $"**Nickname Changed**👤`{before.Username}#{before.Discriminator}`\n\t\t`Old:` {before.Nickname}#{before.Discriminator}\n\t\t`New:` {after.Nickname}#{after.Discriminator}"; | ||||
|                     else if (before.AvatarUrl != after.AvatarUrl) | ||||
|                         str += $"**Avatar Changed**👤`{before.Username}#{before.Discriminator}`\n\t {await _google.ShortenUrl(before.AvatarUrl)} `=>` {await _google.ShortenUrl(after.AvatarUrl)}"; | ||||
|                     else if (!before.Roles.SequenceEqual(after.Roles)) | ||||
|                     { | ||||
|                         if (before.Roles.Count() < after.Roles.Count()) | ||||
|                         { | ||||
|                             var diffRoles = after.Roles.Where(r => !before.Roles.Contains(r)).Select(r => "`" + r.Name + "`"); | ||||
|                             str += $"**User's Roles changed ⚔➕**👤`{before.ToString()}`\n\tNow has {string.Join(", ", diffRoles)} role."; | ||||
|                         } | ||||
|                         else if (before.Roles.Count() > after.Roles.Count()) | ||||
|                         { | ||||
|                             var diffRoles = before.Roles.Where(r => !after.Roles.Contains(r)).Select(r => "`" + r.Name + "`"); | ||||
|                             str += $"**User's Roles changed ⚔➖**👤`{before.ToString()}`\n\tNo longer has {string.Join(", ", diffRoles)} role."; | ||||
|                         } | ||||
|                     } | ||||
|                     else | ||||
|                         return; | ||||
|                     await logChannel.SendMessageAsync(str).ConfigureAwait(false); | ||||
|                 }); | ||||
|  | ||||
|                 return Task.CompletedTask; | ||||
|             } | ||||
|  | ||||
|             private Task _client_ChannelUpdated(IChannel cbefore, IChannel cafter) | ||||
|             { | ||||
|                 var before = cbefore as ITextChannel; | ||||
|                 var before = cbefore as IGuildChannel; | ||||
|                 if (before == null) | ||||
|                     return Task.CompletedTask; | ||||
|                 var after = (ITextChannel)cafter; | ||||
|                 var after = (IGuildChannel)cafter; | ||||
|  | ||||
|                 LogSetting logSetting; | ||||
|                 if (!GuildLogSettings.TryGetValue(before.Guild.Id, out logSetting) | ||||
| @@ -88,7 +130,7 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = before.Guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(before.Guild, logSetting)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
| @@ -97,10 +139,10 @@ namespace NadekoBot.Modules.Administration | ||||
|                         await logChannel.SendMessageAsync($@"`{prettyCurrentTime}` **Channel Name Changed** `#{after.Name}` ({after.Id}) | ||||
|     `Old:` {before.Name} | ||||
|     `New:` {after.Name}").ConfigureAwait(false); | ||||
|                     else if (before.Topic != after.Topic) | ||||
|                     else if ((before as ITextChannel).Topic != (after as ITextChannel).Topic) | ||||
|                         await logChannel.SendMessageAsync($@"`{prettyCurrentTime}` **Channel Topic Changed** `#{after.Name}` ({after.Id}) | ||||
|     `Old:` {before.Topic} | ||||
|     `New:` {after.Topic}").ConfigureAwait(false); | ||||
|     `Old:` {((ITextChannel)before).Topic} | ||||
|     `New:` {((ITextChannel)after).Topic}").ConfigureAwait(false); | ||||
|                 }); | ||||
|  | ||||
|                 return Task.CompletedTask; | ||||
| @@ -119,7 +161,7 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = ch.Guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(ch.Guild, logSetting)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
| @@ -143,7 +185,7 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = ch.Guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(ch.Guild, logSetting)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
| @@ -169,29 +211,28 @@ namespace NadekoBot.Modules.Administration | ||||
|                 LogSetting logSetting; | ||||
|                 if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out logSetting) | ||||
|                     || !logSetting.LogVoicePresence | ||||
|                     || !logSetting.IgnoredChannels.Any(ic => ic.ChannelId == after.VoiceChannel.Id)) | ||||
|                     || logSetting.IgnoredChannels.Any(ic => ic.ChannelId == after.VoiceChannel.Id)) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = usr.Guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(usr.Guild, logSetting, LogChannelType.Voice)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
|                 { | ||||
|                     _log.Info("Voice state"); | ||||
|                     string str = null; | ||||
|                     if (beforeVch?.Guild == afterVch?.Guild) | ||||
|                     { | ||||
|                         await logChannel.SendMessageAsync($"🎼`{prettyCurrentTime}` {usr.Username} moved from **{beforeVch.Name}** to **{afterVch.Name}** voice channel.").ConfigureAwait(false); | ||||
|                         str = $"🎼`{prettyCurrentTime}` {usr.Username} moved from **{beforeVch.Name}** to **{afterVch.Name}** voice channel."; | ||||
|                     } | ||||
|                     else if (beforeVch == null) | ||||
|                     { | ||||
|                         await logChannel.SendMessageAsync($"🎼`{prettyCurrentTime}` {usr.Username} has joined **{afterVch.Name}** voice channel.").ConfigureAwait(false); | ||||
|                         str = $"🎼`{prettyCurrentTime}` {usr.Username} has joined **{afterVch.Name}** voice channel."; | ||||
|                     } | ||||
|                     else if (afterVch == null) | ||||
|                     { | ||||
|                         await logChannel.SendMessageAsync($"🎼`{prettyCurrentTime}` {usr.Username} has left **{beforeVch.Name}** voice channel.").ConfigureAwait(false); | ||||
|                         str = $"🎼`{prettyCurrentTime}` {usr.Username} has left **{beforeVch.Name}** voice channel."; | ||||
|                     } | ||||
|                 }); | ||||
|                     if(str != null) | ||||
|                         UserPresenceUpdates.AddOrUpdate(logChannel, new List<string>() { str }, (id, list) => { list.Add(str); return list; }); | ||||
|  | ||||
|                 return Task.CompletedTask; | ||||
|             } | ||||
| @@ -205,16 +246,15 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = usr.Guild.GetTextChannel(logSetting.UserPresenceChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(usr.Guild, logSetting, LogChannelType.UserPresence)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|                 string str; | ||||
|                 if (before.Status != after.Status) | ||||
|                     str = $"`{prettyCurrentTime}`**{usr.Username}** is now **{after.Status}**."; | ||||
|                 else | ||||
|                     str = $"`{prettyCurrentTime}`**{usr.Username}** is now playing **{after.Status}**."; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
|                 { | ||||
|                     if(before.Status != after.Status) | ||||
|                         await logChannel.SendMessageAsync($"`{prettyCurrentTime}`**{usr.Username}** is now **{after.Status}**."); | ||||
|                     else | ||||
|                         await logChannel.SendMessageAsync($"`{prettyCurrentTime}`**{usr.Username}** is now playing **{after.Status}**."); | ||||
|                 }); | ||||
|                 UserPresenceUpdates.AddOrUpdate(logChannel, new List<string>() { str }, (id, list) => { list.Add(str); return list; }); | ||||
|  | ||||
|                 return Task.CompletedTask; | ||||
|             } | ||||
| @@ -228,7 +268,7 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = usr.Guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(usr.Guild, logSetting)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
| @@ -248,7 +288,7 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = usr.Guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(usr.Guild, logSetting)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
| @@ -268,7 +308,7 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(guild, logSetting)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
| @@ -288,7 +328,7 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(guild, logSetting)) == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
| @@ -302,11 +342,9 @@ namespace NadekoBot.Modules.Administration | ||||
|             private Task _client_MessageDeleted(ulong arg1, Optional<IMessage> imsg) | ||||
|             { | ||||
|                 var msg = (imsg.IsSpecified ? imsg.Value : null) as IUserMessage; | ||||
|                 if (msg == null) | ||||
|                 if (msg == null || msg.IsAuthor()) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var ch = msg.Channel as ITextChannel; | ||||
|  | ||||
|                 var channel = msg.Channel as ITextChannel; | ||||
|                 if (channel == null) | ||||
|                     return Task.CompletedTask; | ||||
| @@ -318,14 +356,16 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = channel.Guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(channel.Guild, logSetting)) == null || logChannel.Id == msg.Id) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
|                 { | ||||
|                     await logChannel.SendMessageAsync($@"🕔`{prettyCurrentTime}` **Message** 🚮 `#{ch.Name}` | ||||
| 👤`{msg.Author.Username}`: {msg.Content} | ||||
|     `Attachements`: {string.Join(", ", msg.Attachments.Select(a=>a.ProxyUrl))}").ConfigureAwait(false); | ||||
|                     var str = $@"🕔`{prettyCurrentTime}` **Message** 🚮 `#{channel.Name}` | ||||
| 👤`{msg.Author.Username}`: {msg.Resolve(userHandling:UserMentionHandling.NameAndDiscriminator)}"; | ||||
|                     if (msg.Attachments.Any()) | ||||
|                         str += $"{Environment.NewLine}`Attachements`: {string.Join(", ", msg.Attachments.Select(a => a.ProxyUrl))}"; | ||||
|                     await logChannel.SendMessageAsync(str).ConfigureAwait(false); | ||||
|                 }); | ||||
|  | ||||
|                 return Task.CompletedTask; | ||||
| @@ -334,7 +374,7 @@ namespace NadekoBot.Modules.Administration | ||||
|             private Task _client_MessageUpdated(Optional<IMessage> optmsg, IMessage imsg2) | ||||
|             { | ||||
|                 var after = imsg2 as IUserMessage; | ||||
|                 if (after == null) | ||||
|                 if (after == null || after.IsAuthor()) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var before = (optmsg.IsSpecified ? optmsg.Value : null) as IUserMessage; | ||||
| @@ -352,15 +392,15 @@ namespace NadekoBot.Modules.Administration | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = channel.Guild.GetTextChannel(logSetting.ChannelId)) == null) | ||||
|                 if ((logChannel = TryGetLogChannel(channel.Guild, logSetting)) == null || logChannel.Id == after.Channel.Id) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
|                 { | ||||
|                     await logChannel.SendMessageAsync($@"🕔`{prettyCurrentTime}` **Message** 📝 `#{channel.Name}` | ||||
| 👤`{before.Author.Username}` | ||||
|         `Old:` {before.Content} | ||||
|         `New:` {after.Content}").ConfigureAwait(false); | ||||
|         `Old:` {before.Resolve(userHandling: UserMentionHandling.NameAndDiscriminator)} | ||||
|         `New:` {after.Resolve(userHandling: UserMentionHandling.NameAndDiscriminator)}").ConfigureAwait(false); | ||||
|                 }); | ||||
|  | ||||
|                 return Task.CompletedTask; | ||||
| @@ -369,7 +409,7 @@ namespace NadekoBot.Modules.Administration | ||||
|             private Task _client_MessageReceived(IMessage imsg) | ||||
|             { | ||||
|                 var msg = imsg as IUserMessage; | ||||
|                 if (msg == null) | ||||
|                 if (msg == null || msg.IsAuthor()) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var channel = msg.Channel as ITextChannel; | ||||
| @@ -382,9 +422,17 @@ namespace NadekoBot.Modules.Administration | ||||
|                     || !logSetting.MessageReceived) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(() => | ||||
|                 ITextChannel logChannel; | ||||
|                 if ((logChannel = TryGetLogChannel(channel.Guild, logSetting)) == null || logChannel.Id == imsg.Channel.Id) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var task = Task.Run(async () => | ||||
|                 { | ||||
|                     _log.Info("Message received"); | ||||
|                     var str = $@"🕔`{prettyCurrentTime}` **New Message** `#{channel.Name}` | ||||
| 👤`{msg.Author.Username}`: {msg.Resolve(userHandling: UserMentionHandling.NameAndDiscriminator)}"; | ||||
|                     if (msg.Attachments.Any()) | ||||
|                         str += $"{Environment.NewLine}`Attachements`: {string.Join(", ", msg.Attachments.Select(a => a.ProxyUrl))}"; | ||||
|                     await logChannel.SendMessageAsync(str).ConfigureAwait(false); | ||||
|                 }); | ||||
|                  | ||||
|                 return Task.CompletedTask; | ||||
| @@ -569,26 +617,27 @@ namespace NadekoBot.Modules.Administration | ||||
|                     await channel.SendMessageAsync($"`Stopped logging user presence updates.`").ConfigureAwait(false); | ||||
|             } | ||||
|  | ||||
|             //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
|             //[RequireContext(ContextType.Guild)] | ||||
|             //public async Task VoicePresence(IUserMessage imsg) | ||||
|             //{ | ||||
|             //    var channel = (ITextChannel)imsg.Channel; | ||||
|             //    bool enabled; | ||||
|             //    using (var uow = DbHandler.UnitOfWork()) | ||||
|             //    { | ||||
|             //        var config = uow.GuildConfigs.For(channel.Guild.Id); | ||||
|             //        LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting); | ||||
|             //        enabled = config.LogSetting.LogVoicePresence = !config.LogSetting.LogVoicePresence; | ||||
|             //        config.LogSetting = logSetting; | ||||
|             //        await uow.CompleteAsync().ConfigureAwait(false); | ||||
|             //    } | ||||
|             [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task VoicePresence(IUserMessage imsg) | ||||
|             { | ||||
|                 var channel = (ITextChannel)imsg.Channel; | ||||
|                 bool enabled; | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 { | ||||
|                     var logSetting = uow.GuildConfigs.For(channel.Guild.Id).LogSetting; | ||||
|                     GuildLogSettings.AddOrUpdate(channel.Guild.Id, (id) => logSetting, (id, old) => logSetting); | ||||
|                     enabled = logSetting.LogVoicePresence = !logSetting.LogVoicePresence; | ||||
|                     if (enabled) | ||||
|                         logSetting.VoicePresenceChannelId = channel.Id; | ||||
|                     await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                 } | ||||
|  | ||||
|             //    if (enabled) | ||||
|             //        await channel.SendMessageAsync($"`Logging voice presence updates in {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false); | ||||
|             //    else | ||||
|             //        await channel.SendMessageAsync($"`Stopped logging voice presence updates.`").ConfigureAwait(false); | ||||
|             //} | ||||
|                 if (enabled) | ||||
|                     await channel.SendMessageAsync($"`Logging voice presence updates in {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false); | ||||
|                 else | ||||
|                     await channel.SendMessageAsync($"`Stopped logging voice presence updates.`").ConfigureAwait(false); | ||||
|             } | ||||
|  | ||||
|             //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] | ||||
|             //[RequireContext(ContextType.Guild)] | ||||
|   | ||||
| @@ -71,7 +71,7 @@ namespace NadekoBot.Modules.Administration | ||||
|                         var usrMsg = umsg as IUserMessage; | ||||
|                         var channel = usrMsg.Channel as ITextChannel; | ||||
|  | ||||
|                         if (channel == null || await usrMsg.IsAuthor()) | ||||
|                         if (channel == null || usrMsg.IsAuthor()) | ||||
|                             return; | ||||
|                         Ratelimiter limiter; | ||||
|                         if (!RatelimitingChannels.TryGetValue(channel.Id, out limiter)) | ||||
|   | ||||
| @@ -8,10 +8,10 @@ namespace NadekoBot.Modules | ||||
| { | ||||
|     public class DiscordModule | ||||
|     { | ||||
|         protected ILocalization _l; | ||||
|         protected CommandService _commands; | ||||
|         protected DiscordSocketClient _client; | ||||
|         protected Logger _log; | ||||
|         protected ILocalization _l { get; } | ||||
|         protected CommandService _commands { get; } | ||||
|         protected DiscordSocketClient _client { get; } | ||||
|         protected Logger _log { get; } | ||||
|  | ||||
|         public DiscordModule(ILocalization loc, CommandService cmds, DiscordSocketClient client) | ||||
|         { | ||||
|   | ||||
| @@ -199,7 +199,7 @@ namespace NadekoBot.Modules.Gambling | ||||
|                     var msg = imsg as IUserMessage; | ||||
|                     if (msg == null) | ||||
|                         return; | ||||
|                     if (await msg.IsAuthor() || !(imsg.Channel is ITextChannel) || imsg.Channel != raceChannel) | ||||
|                     if (msg.IsAuthor() || !(imsg.Channel is ITextChannel) || imsg.Channel != raceChannel) | ||||
|                         return; | ||||
|                     messagesSinceGameStarted++; | ||||
|                 } | ||||
|   | ||||
| @@ -35,7 +35,7 @@ namespace NadekoBot | ||||
|             Client = new DiscordSocketClient(new DiscordSocketConfig | ||||
|             { | ||||
|                 AudioMode = Discord.Audio.AudioMode.Outgoing, | ||||
|                 LargeThreshold = 200, | ||||
|                 MessageCacheSize = 10, | ||||
|                 LogLevel = LogSeverity.Warning, | ||||
|             }); | ||||
|  | ||||
|   | ||||
| @@ -36,8 +36,8 @@ namespace NadekoBot.Extensions | ||||
|         public static async Task<IUserMessage> Reply(this IUserMessage msg, string content) =>  | ||||
|             await msg.Channel.SendMessageAsync(content).ConfigureAwait(false); | ||||
|  | ||||
|         public static Task<bool> IsAuthor(this IUserMessage msg) => | ||||
|             Task.FromResult(NadekoBot.Client.GetCurrentUser().Id == msg.Author.Id); | ||||
|         public static bool IsAuthor(this IUserMessage msg) => | ||||
|             NadekoBot.Client.GetCurrentUser().Id == msg.Author.Id; | ||||
|  | ||||
|         public static IEnumerable<IUser> Members(this IRole role) => | ||||
|             NadekoBot.Client.GetGuild(role.GuildId)?.GetUsers().Where(u => u.Roles.Contains(role)) ?? Enumerable.Empty<IUser>(); | ||||
| @@ -227,5 +227,6 @@ namespace NadekoBot.Extensions | ||||
|         public static ulong GiB(this ulong value) => value.MiB() * 1024; | ||||
|         public static ulong GB(this ulong value) => value.MB() * 1000; | ||||
|  | ||||
|         public static string Unmention(this string str) => str.Replace("@", "ම"); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user