From 6d641431abc27377f6e2ad74c5bf213e7154b8a0 Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Mon, 4 Jul 2016 08:47:29 +0200 Subject: [PATCH] voicepresence, logserver and userpresence persist restarts now. ObservableConcurrentDictionary implementation added. #104 --- .../Classes/ObservableConcurrentDictionary.cs | 204 ++++++++++++++++++ NadekoBot/Classes/ServerSpecificConfig.cs | 47 +++- .../Administration/Commands/LogCommand.cs | 106 +++++---- NadekoBot/Modules/Music/MusicModule.cs | 15 ++ .../lib/ScaredFingers.UnitsConversion.dll | Bin 32768 -> 0 bytes .../lib/ScaredFingers.UnitsConversion.pdb | Bin 79360 -> 0 bytes 6 files changed, 310 insertions(+), 62 deletions(-) create mode 100644 NadekoBot/Classes/ObservableConcurrentDictionary.cs delete mode 100644 NadekoBot/lib/ScaredFingers.UnitsConversion.dll delete mode 100644 NadekoBot/lib/ScaredFingers.UnitsConversion.pdb diff --git a/NadekoBot/Classes/ObservableConcurrentDictionary.cs b/NadekoBot/Classes/ObservableConcurrentDictionary.cs new file mode 100644 index 00000000..cd364328 --- /dev/null +++ b/NadekoBot/Classes/ObservableConcurrentDictionary.cs @@ -0,0 +1,204 @@ +//-------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// File: ObservableConcurrentDictionary.cs +// +//-------------------------------------------------------------------------- + +using System.Collections.Generic; +using System.Collections.Specialized; +using System.ComponentModel; +using System.Diagnostics; +using System.Threading; + +namespace System.Collections.Concurrent +{ + /// + /// Provides a thread-safe dictionary for use with data binding. + /// + /// Specifies the type of the keys in this collection. + /// Specifies the type of the values in this collection. + [DebuggerDisplay("Count={Count}")] + public class ObservableConcurrentDictionary : + ICollection>, IDictionary, + INotifyCollectionChanged, INotifyPropertyChanged + { + private readonly SynchronizationContext _context; + private readonly ConcurrentDictionary _dictionary; + + /// + /// Initializes an instance of the ObservableConcurrentDictionary class. + /// + public ObservableConcurrentDictionary() + { + _context = AsyncOperationManager.SynchronizationContext; + _dictionary = new ConcurrentDictionary(); + } + + /// Event raised when the collection changes. + public event NotifyCollectionChangedEventHandler CollectionChanged; + /// Event raised when a property on the collection changes. + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Notifies observers of CollectionChanged or PropertyChanged of an update to the dictionary. + /// + private void NotifyObserversOfChange() + { + var collectionHandler = CollectionChanged; + var propertyHandler = PropertyChanged; + if (collectionHandler != null || propertyHandler != null) + { + _context.Post(s => + { + if (collectionHandler != null) + { + collectionHandler(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + } + if (propertyHandler != null) + { + propertyHandler(this, new PropertyChangedEventArgs("Count")); + propertyHandler(this, new PropertyChangedEventArgs("Keys")); + propertyHandler(this, new PropertyChangedEventArgs("Values")); + } + }, null); + } + } + + /// Attempts to add an item to the dictionary, notifying observers of any changes. + /// The item to be added. + /// Whether the add was successful. + private bool TryAddWithNotification(KeyValuePair item) + { + return TryAddWithNotification(item.Key, item.Value); + } + + /// Attempts to add an item to the dictionary, notifying observers of any changes. + /// The key of the item to be added. + /// The value of the item to be added. + /// Whether the add was successful. + private bool TryAddWithNotification(TKey key, TValue value) + { + bool result = _dictionary.TryAdd(key, value); + if (result) NotifyObserversOfChange(); + return result; + } + + /// Attempts to remove an item from the dictionary, notifying observers of any changes. + /// The key of the item to be removed. + /// The value of the item removed. + /// Whether the removal was successful. + private bool TryRemoveWithNotification(TKey key, out TValue value) + { + bool result = _dictionary.TryRemove(key, out value); + if (result) NotifyObserversOfChange(); + return result; + } + + /// Attempts to add or update an item in the dictionary, notifying observers of any changes. + /// The key of the item to be updated. + /// The new value to set for the item. + /// Whether the update was successful. + private void UpdateWithNotification(TKey key, TValue value) + { + _dictionary[key] = value; + NotifyObserversOfChange(); + } + + #region ICollection> Members + void ICollection>.Add(KeyValuePair item) + { + TryAddWithNotification(item); + } + + void ICollection>.Clear() + { + ((ICollection>)_dictionary).Clear(); + NotifyObserversOfChange(); + } + + bool ICollection>.Contains(KeyValuePair item) + { + return ((ICollection>)_dictionary).Contains(item); + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + ((ICollection>)_dictionary).CopyTo(array, arrayIndex); + } + + int ICollection>.Count { + get { return ((ICollection>)_dictionary).Count; } + } + + bool ICollection>.IsReadOnly { + get { return ((ICollection>)_dictionary).IsReadOnly; } + } + + bool ICollection>.Remove(KeyValuePair item) + { + TValue temp; + return TryRemoveWithNotification(item.Key, out temp); + } + #endregion + + #region IEnumerable> Members + IEnumerator> IEnumerable>.GetEnumerator() + { + return ((ICollection>)_dictionary).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((ICollection>)_dictionary).GetEnumerator(); + } + #endregion + + #region IDictionary Members + public void Add(TKey key, TValue value) + { + TryAddWithNotification(key, value); + } + + public bool ContainsKey(TKey key) + { + return _dictionary.ContainsKey(key); + } + + public ICollection Keys { + get { return _dictionary.Keys; } + } + + public bool Remove(TKey key) + { + TValue temp; + return TryRemoveWithNotification(key, out temp); + } + + public bool TryGetValue(TKey key, out TValue value) + { + return _dictionary.TryGetValue(key, out value); + } + + public bool TryAdd(TKey key, TValue value) + { + return TryAddWithNotification(key, value); + } + + public ICollection Values { + get { return _dictionary.Values; } + } + + public TValue this[TKey key] { + get { return _dictionary[key]; } + set { UpdateWithNotification(key, value); } + } + + public bool TryRemove(TKey key, out TValue value) + { + return TryRemoveWithNotification(key, out value); + } + #endregion + } +} \ No newline at end of file diff --git a/NadekoBot/Classes/ServerSpecificConfig.cs b/NadekoBot/Classes/ServerSpecificConfig.cs index b8c2cc9d..bbc4eadd 100644 --- a/NadekoBot/Classes/ServerSpecificConfig.cs +++ b/NadekoBot/Classes/ServerSpecificConfig.cs @@ -82,6 +82,45 @@ namespace NadekoBot.Classes } } + [JsonProperty("LogChannel")] + private ulong? logServerChannel = null; + [JsonIgnore] + public ulong? LogServerChannel { + get { return logServerChannel; } + set { + logServerChannel = value; + if (!SpecificConfigurations.Instantiated) return; + OnPropertyChanged(); + } + } + + [JsonProperty("LogPresenceChannel")] + private ulong? logPresenceChannel = null; + [JsonIgnore] + public ulong? LogPresenceChannel { + get { return logPresenceChannel; } + set { + logPresenceChannel = value; + if (!SpecificConfigurations.Instantiated) return; + OnPropertyChanged(); + } + } + + [JsonIgnore] + private ObservableConcurrentDictionary voiceChannelLog; + public ObservableConcurrentDictionary VoiceChannelLog { + get { return voiceChannelLog; } + set { + voiceChannelLog = value; + if (value != null) + voiceChannelLog.CollectionChanged += (s, e) => + { + if (!SpecificConfigurations.Instantiated) return; + OnPropertyChanged(); + }; + } + } + [JsonIgnore] private ObservableCollection listOfSelfAssignableRoles; public ObservableCollection ListOfSelfAssignableRoles { @@ -110,7 +149,6 @@ namespace NadekoBot.Classes [JsonIgnore] private ObservableCollection generateCurrencyChannels; - public ObservableCollection GenerateCurrencyChannels { get { return generateCurrencyChannels; } set { @@ -124,9 +162,6 @@ namespace NadekoBot.Classes } } - [JsonIgnore] - private ObservableCollection observingStreams; - [JsonIgnore] private bool autoDeleteMessagesOnCommand = false; public bool AutoDeleteMessagesOnCommand { @@ -138,6 +173,9 @@ namespace NadekoBot.Classes } } + + [JsonIgnore] + private ObservableCollection observingStreams; public ObservableCollection ObservingStreams { get { return observingStreams; } set { @@ -167,6 +205,7 @@ namespace NadekoBot.Classes ListOfSelfAssignableRoles = new ObservableCollection(); ObservingStreams = new ObservableCollection(); GenerateCurrencyChannels = new ObservableCollection(); + VoiceChannelLog = new ObservableConcurrentDictionary(); } public event PropertyChangedEventHandler PropertyChanged = delegate { SpecificConfigurations.Default.Save(); }; diff --git a/NadekoBot/Modules/Administration/Commands/LogCommand.cs b/NadekoBot/Modules/Administration/Commands/LogCommand.cs index 41bbdcd5..3cd92485 100644 --- a/NadekoBot/Modules/Administration/Commands/LogCommand.cs +++ b/NadekoBot/Modules/Administration/Commands/LogCommand.cs @@ -4,22 +4,12 @@ using NadekoBot.Classes; using NadekoBot.Extensions; using NadekoBot.Modules.Permissions.Classes; using System; -using System.Collections.Concurrent; using System.Linq; -using System.Threading.Tasks; namespace NadekoBot.Modules.Administration.Commands { internal class LogCommand : DiscordCommand { - - //server-channel - private readonly ConcurrentDictionary logs = new ConcurrentDictionary(); - //server-channel - private readonly ConcurrentDictionary loggingPresences = new ConcurrentDictionary(); - //channel-channel - private readonly ConcurrentDictionary voiceChannelLog = new ConcurrentDictionary(); - private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】"; public LogCommand(DiscordModule module) : base(module) @@ -61,8 +51,8 @@ namespace NadekoBot.Modules.Administration.Commands { try { - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId)) + 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) @@ -82,8 +72,8 @@ namespace NadekoBot.Modules.Administration.Commands { try { - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId)) + 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) @@ -97,8 +87,8 @@ namespace NadekoBot.Modules.Administration.Commands { try { - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId)) + 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) @@ -112,8 +102,8 @@ namespace NadekoBot.Modules.Administration.Commands { try { - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId)) + 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) @@ -127,8 +117,8 @@ namespace NadekoBot.Modules.Administration.Commands { try { - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId)) + 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) @@ -142,8 +132,8 @@ namespace NadekoBot.Modules.Administration.Commands { try { - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId)) + 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) @@ -157,8 +147,8 @@ namespace NadekoBot.Modules.Administration.Commands { try { - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId)) + 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) @@ -168,29 +158,14 @@ namespace NadekoBot.Modules.Administration.Commands catch { } } - public Func DoFunc() => async e => - { - ulong chId; - if (!logs.TryRemove(e.Server.Id, out chId)) - { - logs.TryAdd(e.Server.Id, e.Channel.Id); - await e.Channel.SendMessage($"❗**I WILL BEGIN LOGGING SERVER ACTIVITY IN THIS CHANNEL**❗").ConfigureAwait(false); - return; - } - Channel ch; - if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) - return; - await e.Channel.SendMessage($"❗**NO LONGER LOGGING IN {ch.Mention} CHANNEL**❗").ConfigureAwait(false); - }; - private async void MsgRecivd(object sender, MessageEventArgs e) { try { if (e.Server == null || e.Channel.IsPrivate || e.User.Id == NadekoBot.Client.CurrentUser.Id) return; - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId) || e.Channel.Id == chId) + var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; + if (chId == null || e.Channel.Id == chId) return; Channel ch; if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) @@ -217,8 +192,8 @@ namespace NadekoBot.Modules.Administration.Commands { if (e.Server == null || e.Channel.IsPrivate || e.User?.Id == NadekoBot.Client.CurrentUser.Id) return; - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId) || e.Channel.Id == chId) + var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; + if (chId == null || e.Channel.Id == chId) return; Channel ch; if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) @@ -244,8 +219,8 @@ namespace NadekoBot.Modules.Administration.Commands { if (e.Server == null || e.Channel.IsPrivate || e.User?.Id == NadekoBot.Client.CurrentUser.Id) return; - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId) || e.Channel.Id == chId) + var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; + if (chId == null || e.Channel.Id == chId) return; Channel ch; if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) @@ -260,10 +235,11 @@ $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}` } private async void UsrUpdtd(object sender, UserUpdatedEventArgs e) { + var config = SpecificConfigurations.Default.Of(e.Server.Id); try { - ulong chId; - if (!loggingPresences.TryGetValue(e.Server.Id, out chId)) + var chId = config.LogServerChannel; + if (chId != null) { Channel ch; if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) != null) @@ -289,11 +265,11 @@ $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}` var notifyJoin = false; if ((beforeVch != null || afterVch != null) && (beforeVch != afterVch)) // this means we need to notify for sure. { - if (beforeVch != null && voiceChannelLog.TryGetValue(beforeVch.Id, out notifyChBeforeId) && (notifyChBefore = e.Before.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChBeforeId)) != null) + 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 && voiceChannelLog.TryGetValue(afterVch.Id, out notifyChAfterId) && (notifyChAfter = e.After.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChAfterId)) != null) + if (afterVch != null && config.VoiceChannelLog.TryGetValue(afterVch.Id, out notifyChAfterId) && (notifyChAfter = e.After.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChAfterId)) != null) { notifyJoin = true; } @@ -315,8 +291,8 @@ $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}` try { - ulong chId; - if (!logs.TryGetValue(e.Server.Id, out chId)) + 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) @@ -377,17 +353,30 @@ $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}` .Description("Toggles logging in this channel. Logs every message sent/deleted/edited on the server. **Bot Owner Only!**") .AddCheck(SimpleCheckers.OwnerOnly()) .AddCheck(SimpleCheckers.ManageServer()) - .Do(DoFunc()); + .Do(async e => + { + var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; + if (chId == null) + { + SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = e.Channel.Id; + await e.Channel.SendMessage($"❗**I WILL BEGIN LOGGING SERVER ACTIVITY IN THIS CHANNEL**❗").ConfigureAwait(false); + return; + } + Channel ch; + if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null) + return; + await e.Channel.SendMessage($"❗**NO LONGER LOGGING IN {ch.Mention} CHANNEL**❗").ConfigureAwait(false); + }); cgb.CreateCommand(Module.Prefix + "userpresence") .Description("Starts logging to this channel when someone from the server goes online/offline/idle.") .AddCheck(SimpleCheckers.ManageServer()) .Do(async e => { - ulong chId; - if (!loggingPresences.TryRemove(e.Server.Id, out chId)) + var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel; + if (chId == null) { - loggingPresences.TryAdd(e.Server.Id, e.Channel.Id); + SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = e.Channel.Id; await e.Channel.SendMessage($"**User presence notifications enabled.**").ConfigureAwait(false); return; } @@ -402,11 +391,12 @@ $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}` .Do(async e => { + var config = SpecificConfigurations.Default.Of(e.Server.Id); if (e.GetArg("all")?.ToLower() == "all") { foreach (var voiceChannel in e.Server.VoiceChannels) { - voiceChannelLog.TryAdd(voiceChannel.Id, e.Channel.Id); + config.VoiceChannelLog.TryAdd(voiceChannel.Id, e.Channel.Id); } await e.Channel.SendMessage("Started logging user presence for **ALL** voice channels!").ConfigureAwait(false); return; @@ -418,9 +408,9 @@ $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}` return; } ulong throwaway; - if (!voiceChannelLog.TryRemove(e.User.VoiceChannel.Id, out throwaway)) + if (!config.VoiceChannelLog.TryRemove(e.User.VoiceChannel.Id, out throwaway)) { - voiceChannelLog.TryAdd(e.User.VoiceChannel.Id, e.Channel.Id); + config.VoiceChannelLog.TryAdd(e.User.VoiceChannel.Id, e.Channel.Id); await e.Channel.SendMessage($"`Logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false); } else diff --git a/NadekoBot/Modules/Music/MusicModule.cs b/NadekoBot/Modules/Music/MusicModule.cs index 2d0dbd86..f2e2071a 100644 --- a/NadekoBot/Modules/Music/MusicModule.cs +++ b/NadekoBot/Modules/Music/MusicModule.cs @@ -105,6 +105,21 @@ namespace NadekoBot.Modules.Music } }); + //cgb.CreateCommand("soundcloudqueue") + // .Alias("sq") + // .Description("Queue a soundcloud song using keywords. Bot will join your voice channel." + + // "**You must be in a voice channel**.\n**Usage**: `!m sq Dream Of Venice`") + // .Parameter("query", ParameterType.Unparsed) + // .Do(async e => + // { + // await QueueSong(e.Channel, e.User.VoiceChannel, e.GetArg("query")).ConfigureAwait(false); + // if (e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages) + // { + // await Task.Delay(10000).ConfigureAwait(false); + // await e.Message.Delete().ConfigureAwait(false); + // } + // }); + cgb.CreateCommand("listqueue") .Alias("lq") .Description("Lists 15 currently queued songs per page. Default page is 1.\n**Usage**: `!m lq` or `!m lq 2`") diff --git a/NadekoBot/lib/ScaredFingers.UnitsConversion.dll b/NadekoBot/lib/ScaredFingers.UnitsConversion.dll deleted file mode 100644 index 8b1218117d7450c617d8d8bd2b094b529eda113e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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�jYm1P|5f+{k| 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