Chat ma wygladać na zasadzie user -> admin. Zwykły uzytkownik może pisać tylko z adminami, a admin ze wszystkimi uzytkownikami. Nie moge sobie poradzić.
public override System.Threading.Tasks.Task OnConnected()
{
ApplicationDbContext db = new ApplicationDbContext();
ApplicationUser userDTO = db.Users.Where(x => x.UserName.Equals(Context.User.Identity.Name)).FirstOrDefault();
string userId = userDTO.Id;
string connId = Context.ConnectionId;
if (!db.Online.Any(x => x.Id == userId))
{
Online online = new Online();
online.Id = userId;
online.ConnId = connId;
db.Online.Add(online);
db.SaveChanges();
}
List<string> onlineIds = db.Online.ToArray().Select(x => x.Id).ToList();
var adminId = db.Roles.Where(p => p.Name == "Admin").Select(p => p.Id).Single();
List<string> allFriendsIds = new List<string>();
if (userDTO.Roles.Any(p => p.RoleId.Contains(adminId)))
{
allFriendsIds = db.Users.Where(p => p.Roles.Any(r => !r.RoleId.Contains(adminId))).Select(p => p.Id).ToList();
//Admin
}
else
{
allFriendsIds = db.Users.Where(p => p.Roles.Any(r => r.RoleId.Contains(adminId))).Select(x => x.Id).ToList();
//User
}
List<string> resultList = onlineIds.Where((i) => allFriendsIds.Contains(i)).ToList();
Dictionary<string, string> dictFriends = new Dictionary<string, string>();
foreach (var id in resultList)
{
var users = db.Users.Find(id);
string friend = users.Name;
if (!dictFriends.ContainsValue(id))
{
dictFriends.Add(id, friend);
}
}
var transformed = from key in dictFriends.Keys
select new { id = key, friend = dictFriends[key] };
string json = JsonConvert.SerializeObject(transformed);
var clients = Clients.Caller;
clients.getonlinefriends(userDTO.Name, json);
UpdateChat();
return base.OnConnected();
}
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
ApplicationDbContext db = new ApplicationDbContext();
ApplicationUser userDTO = db.Users.Where(x => x.UserName.Equals(Context.User.Identity.Name)).FirstOrDefault();
string userId = userDTO.Id;
if (db.Online.Any(x => x.Id == userId))
{
Online online = db.Online.Find(userId);
db.Online.Remove(online);
db.SaveChanges();
}
UpdateChat();
return base.OnDisconnected(stopCalled);
}
public void UpdateChat()
{
ApplicationDbContext db = new ApplicationDbContext();
List<string> onlineIds = db.Online.ToArray().Select(x => x.Id).ToList();
foreach (var idUser in onlineIds)
{
ApplicationUser user = db.Users.Find(idUser);
var adminId = db.Roles.Where(p => p.Name == "Admin").Select(p => p.Id).Single();
List<string> allFriendsIds = new List<string>();
if (user.Roles.Any(p => p.RoleId.Contains(adminId)))
{
allFriendsIds = db.Users.Where(p => p.Roles.Any(r => !r.RoleId.Contains(adminId))).Select(p => p.Id).ToList();
//Admin
}
else
{
allFriendsIds = db.Users.Where(p => p.Roles.Any(r => r.RoleId.Contains(adminId))).Select(x => x.Id).ToList();
//User
}
List<string> resultList = onlineIds.Where((i) => allFriendsIds.Contains(i)).ToList();
Dictionary<string, string> dictFriends = new Dictionary<string, string>();
foreach (var id in resultList)
{
var users = db.Users.Find(id);
string friend = users.Name;
if (!dictFriends.ContainsValue(id))
{
dictFriends.Add(id, friend);
}
}
var transformed = from key in dictFriends.Keys
select new { id = key, friend = dictFriends[key] };
string json = JsonConvert.SerializeObject(transformed);
var clients = Clients.All;
clients.updatechat(user.Name, json);
}
}