Facebookのフォトアルバム作成でプライバシー設定ができるようにする。
これもMicrosoft製のFacebookライブラリの問題で、CreateAlbumにパラメータが用意されていないため。Facebook上でプライバシー設定して作成したアルバムは、GetAlbumsで取得するとvisibleというプロパティに、"everyone", "friends-of-friends", "friends", "custom"などが入っています。しかし、Photos.CreateAlbumにはありません。しかし、仕様を見れば、visibleオプションまたはprivacyオプションというパラメータが用意されていることが分かります。しかしApiを実行している肝心のFacebook.Rest.Photos.CreateAlbumの実装では、オプションパラメータは3つしか受けていません。脱力。
Photos.cs
: private album CreateAlbum(string name, string location, string description, long uid ,bool isAsync, CreateAlbumCallback callback, Object state) { var parameterList = new Dictionary<string, string> { {"method", "facebook.photos.createAlbum"}}; Utilities.AddRequiredParameter(parameterList, "name", name); Utilities.AddOptionalParameter(parameterList, "location", location); Utilities.AddOptionalParameter(parameterList, "description", description); Utilities.AddOptionalParameter(parameterList, "uid", uid); :
仕方ないのでやっぱり改造。visibleパラメータはレガシーなので細かく設定できるprivacyパラメータだけ使うことにします。それにvisibleはenumにできないですし。friends-of-friendsとかハイフン使っちゃっているので。その辺りも含めprivacyは練られています。
public enum Privacy { EVERYONE, ALL_FRIENDS, FRIENDS_OF_FRIENDS, SELF } private album CreateAlbum(string name, string location, string description, long uid ,Privacy? privacy, bool isAsync, CreateAlbumCallback callback, Object state) { : if (privacy.HasValue) { Utilities.AddOptionalParameter(parameterList, "privacy", "{ value: \"" + privacy.Value.ToString() + "\"}"); } :
あとは適当にCreateAlbumの使いやすい引数セットのオーバーロードメソッドを用意してあげれば割と使える感じに。本当はもうちょっとちゃんとしたオブジェクトにしてJSON文字列にシリアライズしてからセットするというようなことをやってあげると良いんでしょうけど、フレンドIDごととかフレンドリストIDごととか細かい設定まで使う予定がなく、今のところオーバースペックなので、とりあえずvalueしか扱ってません。