@@ -7,6 +7,7 @@ namespace Discord.Commands
|
||||
internal class CommandMap
|
||||
{
|
||||
static readonly char[] _whitespaceChars = new char[] { ' ', '\r', '\n' };
|
||||
private readonly object _lockObj = new object();
|
||||
|
||||
private readonly ConcurrentDictionary<string, CommandMapNode> _nodes;
|
||||
|
||||
@@ -27,7 +28,7 @@ namespace Discord.Commands
|
||||
else
|
||||
name = text.Substring(0, nextSpace);
|
||||
|
||||
lock (this)
|
||||
lock (_lockObj)
|
||||
{
|
||||
var nextNode = _nodes.GetOrAdd(name, x => new CommandMapNode(x));
|
||||
nextNode.AddCommand(nextSpace == -1 ? "" : text, nextSpace + 1, command);
|
||||
@@ -46,7 +47,7 @@ namespace Discord.Commands
|
||||
else
|
||||
name = text.Substring(0, nextSpace);
|
||||
|
||||
lock (this)
|
||||
lock (_lockObj)
|
||||
{
|
||||
CommandMapNode nextNode;
|
||||
if (_nodes.TryGetValue(name, out nextNode))
|
||||
@@ -69,7 +70,7 @@ namespace Discord.Commands
|
||||
else
|
||||
name = text.Substring(0, nextSpace);
|
||||
|
||||
lock (this)
|
||||
lock (_lockObj)
|
||||
{
|
||||
CommandMapNode nextNode;
|
||||
if (_nodes.TryGetValue(name, out nextNode))
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace Discord.Commands
|
||||
{
|
||||
private readonly ConcurrentDictionary<string, CommandMapNode> _nodes;
|
||||
private readonly string _name;
|
||||
private readonly object _lockObj = new object();
|
||||
private ImmutableArray<Command> _commands;
|
||||
|
||||
public bool IsEmpty => _commands.Length == 0 && _nodes.Count == 0;
|
||||
@@ -24,7 +25,7 @@ namespace Discord.Commands
|
||||
int nextSpace = text.IndexOf(' ', index);
|
||||
string name;
|
||||
|
||||
lock (this)
|
||||
lock (_lockObj)
|
||||
{
|
||||
if (text == "")
|
||||
_commands = _commands.Add(command);
|
||||
@@ -45,7 +46,7 @@ namespace Discord.Commands
|
||||
int nextSpace = text.IndexOf(' ', index);
|
||||
string name;
|
||||
|
||||
lock (this)
|
||||
lock (_lockObj)
|
||||
{
|
||||
if (text == "")
|
||||
_commands = _commands.Remove(command);
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace Discord.WebSocket
|
||||
internal class SocketGlobalUser : User, ISocketUser
|
||||
{
|
||||
internal override bool IsAttached => true;
|
||||
private readonly object _lockObj = new object();
|
||||
|
||||
private ushort _references;
|
||||
|
||||
@@ -25,13 +26,13 @@ namespace Discord.WebSocket
|
||||
{
|
||||
checked
|
||||
{
|
||||
lock (this)
|
||||
lock (_lockObj)
|
||||
_references++;
|
||||
}
|
||||
}
|
||||
public void RemoveRef(DiscordSocketClient discord)
|
||||
{
|
||||
lock (this)
|
||||
lock (_lockObj)
|
||||
{
|
||||
if (--_references == 0)
|
||||
discord.RemoveUser(Id);
|
||||
@@ -40,14 +41,14 @@ namespace Discord.WebSocket
|
||||
|
||||
public override void Update(Model model, UpdateSource source)
|
||||
{
|
||||
lock (this)
|
||||
lock (_lockObj)
|
||||
base.Update(model, source);
|
||||
}
|
||||
public void Update(PresenceModel model, UpdateSource source)
|
||||
{
|
||||
//Race conditions are okay here. Multiple shards racing already cant guarantee presence in order.
|
||||
|
||||
//lock (this)
|
||||
//lock (_lockObj)
|
||||
//{
|
||||
var game = model.Game != null ? new Game(model.Game) : null;
|
||||
Presence = new Presence(game, model.Status);
|
||||
|
||||
Reference in New Issue
Block a user