private void _ClientHandlerStage3(RequestCode RQ, ReaderWriter RW, ref BooruUser User) { switch (RQ) { default: throw new NotSupportedException("Unknown request code"); case RequestCode.Get_Post: { ulong id = RW.ReadULong(); using (var post = _Booru.GetPost(User, id, false)) post.ToWriter(RW); } break; case RequestCode.Get_Thumb: { ulong id = RW.ReadULong(); using (var thumb = _Booru.GetThumbnail(User, id)) thumb.ToWriter(RW); } break; case RequestCode.Get_Image: { ulong id = RW.ReadULong(); using (var image = _Booru.GetImage(User, id)) image.ToWriter(RW); } break; case RequestCode.Get_Tag: { ulong id = RW.ReadULong(); _Booru.GetTag(User, id).ToWriter(RW); } break; case RequestCode.Get_Info: _Booru.BooruInfo.ToWriter(RW); break; case RequestCode.Get_AllTags: { List <string> tags = _Booru.GetAllTags(); RW.Write((uint)tags.Count); foreach (string tag in tags) { RW.Write(tag, true); } } break; case RequestCode.Get_PostTags: { ulong id = RW.ReadULong(); using (var post = _Booru.GetPost(User, id, false)) post.Tags.ToWriter(RW); } break; case RequestCode.Get_User: User.ToWriter(RW); break; case RequestCode.Get_PostCount: RW.Write(_Booru.GetPostCount()); break; case RequestCode.Search_String: //User limitations? { string pattern = RW.ReadString(); List <ulong> ids = _Booru.Search(User, pattern); RW.Write((uint)ids.Count); foreach (ulong id in ids) { RW.Write(id); } } break; case RequestCode.Search_Image: throw new NotImplementedException(); //TODO Implement case RequestCode.Login: { string username = RW.ReadString(); string password = RW.ReadString(); User = _Booru.Login(User, username, password); } break; case RequestCode.Logout: User = _Booru.DefaultUser; break; case RequestCode.Search_Tags: { string term = RW.ReadString(); byte limit = RW.ReadByte(); _Booru.SearchTags(term, limit).ToWriter(RW); } break; case RequestCode.Start_GC: if (!User.IsAdmin) { throw new BooruException(BooruException.ErrorCodes.NoPermission); } else { GC.Collect(); } break; case RequestCode.Add_Post: using (var post = BooruPost.FromReader(RW)) { post.Tags = BooruTagList.FromReader(RW); post.Image = BooruImage.FromReader(RW); ulong id = _Booru.AddPost(User, post); RW.Write(id); if (_MN != null) { using (var thumb = _Booru.GetThumbnail(null, id)) _MN.NotificatePostAdded(id, post, thumb); } } break; case RequestCode.Edit_Post: { using (var post = BooruPost.FromReader(RW)) { post.Tags = BooruTagList.FromReader(RW); _Booru.EditPost(User, post); } } break; case RequestCode.Edit_Image: { ulong id = RW.ReadULong(); using (var image = BooruImage.FromReader(RW)) _Booru.EditImage(User, id, image); } break; case RequestCode.Delete_Post: { ulong id = RW.ReadULong(); _Booru.DeletePost(User, id); } break; } }