using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace ChatRoomServer.Www.Areas.Api.Controllers { using System.Data.Entity; using System.Net.Http.Headers; using System.Threading.Tasks; using System.Web.Http.Cors; using System.Web.Http.Results; using ChatRoomServer.Db; using ChatRoomServer.Db.Entities; [RoutePrefix("api/users"), Authorize] public class UsersController : ApiController { [Route("blockList")] public async Task BlockUsersList([FromBody] Dictionary query) { var searchUser = query.GetValue("searchUser") ?? ""; var pageIndex = query.GetValue("pageIndex").ToInt32(1); var pagesize = query.GetValue("pagesize").ToInt32(20); var db = new ChatDb(); var data = await db.GetBlockUserList(searchUser, pagesize, pageIndex); return new { count = data.TotalCount, list = data.Data }; } [Route("connectionLog")] public async Task ConnectionLog([FromBody] Dictionary query) { var searchUser = query.GetValue("searchUser") ?? ""; var pageIndex = query.GetValue("pageIndex").ToInt32(1); var pagesize = query.GetValue("pagesize").ToInt32(20); var db = new ChatDb(); var data = await db.GetConnectionLogList(searchUser, pagesize, pageIndex); var rooms = data.Data.Select(s => s.RoomID).Distinct().ToArray(); var roomdata = await db.Rooms.Where(s => rooms.Contains(s.ID)).ToDictionaryAsync(s => s.ID); return new { count = data.TotalCount, list = data.Data.Select(s => new { msg = s, room = roomdata.GetValue(s.RoomID) }) }; } [Route("list"), HttpGet] public async Task UserList(int pageindex, int pagesize, string user) { var db = new ChatDb(); var data = await db.GetUserList(user, pagesize, pageindex); return new { count = data.TotalCount, list = data.Data }; } [Route("abuseList")] public async Task AbuseList([FromBody]Dictionary query) { var pageindex = query.GetValue("pageIndex").ToInt32(1); var pageSize = query.GetValue("pageSize").ToInt32(20); var filter = query.GetValue("filter").ToInt32(-1); var db = new ChatDb(); var data = await db.GetAbuseReportPagedList(filter, pageindex, pageSize); //rooms var msgids = (from p in data.Data select p.TargetId).Distinct().ToArray(); var msgs = await db.MsgLogs.Where(s => msgids.Contains(s.Id)).ToDictionaryAsync(s => s.Id); var roomids = (from p in msgs select p.Value.RoomId).Distinct().ToArray(); var rooms = await db.Rooms.Where(s => roomids.Contains(s.ID)).ToDictionaryAsync(s => s.ID); return new { itemsCount = data.TotalCount, items = data.Data.Select(s => new { id = s.Id, msg = msgs[s.TargetId], room = rooms[msgs[s.TargetId].RoomId], info = s }) }; } [Route("updateAbuseReport")] public async Task UpdateAbuseState([FromBody] Dictionary query) { var db = new ChatDb(); var item = await db.AbuseReports.FindAsync(query["id"]); if (item == null || item.Status != ReportState.Submited) return new { success = false, message = "report not found or has been processed." }; var newStatus = query["status"]; var msg = (string)null; var result = true; if (newStatus == 3) { //忽略 item.Status = ReportState.Invalid; } else if (newStatus == 1 || newStatus == 2) { var username = newStatus == 1 ? item.TargetUser : item.ReportUser; DateTime? expiresTime; result = BanUser(username, query["bantime"], out expiresTime); item.Status = ReportState.Processed; if (result) msg = $"已屏蔽指定用户。用户名:{username},解封时间:" + (expiresTime.HasValue ? expiresTime.Value.ToString() : "永久") + "。"; else msg = "操作失败。"; } await db.SaveChangesAsync(); return new { success = result, message = msg ?? "更新成功。" }; } bool BanUser(string username, int banTime, out DateTime? expiresTime) { var db = new ChatDb(); //是否已经有屏蔽记录了? var currentRule = db.GetBlockRuleForUser(username).LastOrDefault(); if (currentRule != null) { if (currentRule.UnblockTime != null) { //如果是隔期解开的,那么将会延长 if (banTime == 0) { expiresTime = null; currentRule.UnblockTime = null; } else { currentRule.UnblockTime = currentRule.UnblockTime.Value.AddMinutes(banTime); expiresTime = currentRule.UnblockTime; } } else { expiresTime = null; } } else { currentRule = new BlockUser() { BlockTime = DateTime.Now, UserName = username, UnblockTime = banTime == 0 ? null : (DateTime?)DateTime.Now.AddMinutes(300) }; db.BlockUsers.Add(currentRule); expiresTime = currentRule.UnblockTime; } db.SaveChanges(); return true; } } }