/// <summary>
		/// Gets the player matching the specified ID as an asynchronous operation.
		/// </summary>
		/// <param name="playerID"></param>
		/// <returns>A task with the return type of list of <see cref="PlayerInfo"/> objects.</returns>
		public Task<PlayerInfo> GetPlayerAsync(int playerID)
		{
			return Task.Run(() =>
			{
				using (QueryResult reader = db.QueryReader("SELECT * FROM UserSpecificFunctions WHERE UserID=@0;", playerID.ToString()))
				{
					if (reader.Read())
					{
						PlayerInfo playerInfo = new PlayerInfo();
						playerInfo.Load(reader);
						return playerInfo;
					}
				}

				return null;
			});
		}
		/// <summary>
		/// Asynchronously inserts a player into the database.
		/// </summary>
		/// <param name="player"></param>
		/// <returns></returns>
		public Task<bool> AddPlayerAsync(PlayerInfo player)
		{
			return Task.Run(() => 
			{
				try
				{
					lock (PlayerData)
					{
						PlayerData.Add(player);
						string query = "INSERT INTO UserSpecificFunctions (UserID, Prefix, Suffix, Color, Permissions) VALUES (@0, @1, @2, @3, @4);";
						return db.Query(query, player.UserID, player.Prefix, player.Suffix, player.ChatColor, player.Permissions.Any() ? player.Permissions.Separate(",") : null) == 1;
					}
				}
				catch(Exception ex)
				{
					TShock.Log.Error(ex.ToString());
					return false;
				}
			});
		}