Mam w swojej aplikacji chat który działa na zasadzie ze uzytkownik moze pisac tylko z użytkownikiem ktory jest jego znajomym. Chciałbym teraz zrobić aby zwykły użytkownik miał na licie kontaktów tylko userów z rola Admin, a admin zeby miał wszystkich uzytkownikow. Probowałem sam aczkolwiek nie uzyskałem pożadanego wyniku.
[HubName("echo")]
public class EchoHub : Hub
{
public override Task OnConnected()
{
Db db = new Db();
UserDTO userDTO = db.Users.Where(x => x.Username.Equals(Context.User.Identity.Name)).FirstOrDefault();
int userId = userDTO.Id;
string connId = Context.ConnectionId;
if (! db.Online.Any(x => x.Id == userId))
{
OnlineDTO online = new OnlineDTO();
online.Id = userId;
online.ConnId = connId;
db.Online.Add(online);
db.SaveChanges();
}
List<int> onlineIds = db.Online.ToArray().Select(x => x.Id).ToList();
List<int> friendIds1 = db.Friends.Where(x => x.User1 == userId && x.Active == true).ToArray().Select(x => x.User2).ToList();
List<int> friendIds2 = db.Friends.Where(x => x.User2 == userId && x.Active == true).ToArray().Select(x => x.User1).ToList();
List<int> allFriendsIds = friendIds1.Concat(friendIds2).ToList();
List<int> resultList = onlineIds.Where((i) => allFriendsIds.Contains(i)).ToList();
Dictionary<int, string> dictFriends = new Dictionary<int, string>();
foreach (var id in resultList)
{
var users = db.Users.Find(id);
string friend = users.Username;
if (!dictFriends.ContainsKey(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(Context.User.Identity.Name, json);
UpdateChat();
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
Db db = new Db();
UserDTO userDTO = db.Users.Where(x => x.Username.Equals(Context.User.Identity.Name)).FirstOrDefault();
int userId = userDTO.Id;
if (db.Online.Any(x => x.Id == userId))
{
OnlineDTO online = db.Online.Find(userId);
db.Online.Remove(online);
db.SaveChanges();
}
UpdateChat();
return base.OnDisconnected(stopCalled);
}
public void UpdateChat()
{
Db db = new Db();
List<int> onlineIds = db.Online.ToArray().Select(x => x.Id).ToList();
foreach (var userId in onlineIds)
{
UserDTO user = db.Users.Find(userId);
string username = user.Username;
List<int> friendIds1 = db.Friends.Where(x => x.User1 == userId && x.Active == true).ToArray().Select(x => x.User2).ToList();
List<int> friendIds2 = db.Friends.Where(x => x.User2 == userId && x.Active == true).ToArray().Select(x => x.User1).ToList();
List<int> allFriendsIds = friendIds1.Concat(friendIds2).ToList();
List<int> resultList = onlineIds.Where((i) => allFriendsIds.Contains(i)).ToList();
Dictionary<int, string> dictFriends = new Dictionary<int, string>();
foreach (var id in resultList)
{
var users = db.Users.Find(id);
string friend = users.Username;
if (!dictFriends.ContainsKey(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(username, json);
}
}
public void SendChat(int friendId, string friendUsername, string message)
{
Db db = new Db();
UserDTO userDTO = db.Users.Where(x => x.Username.Equals(Context.User.Identity.Name)).FirstOrDefault();
int userId = userDTO.Id;
var clients = Clients.All;
clients.sendchat(userId, Context.User.Identity.Name, friendId, friendUsername, message);
}
}
}
<div class="chat @User.Identity.Name">
<ul></ul>
</div>
@section Scripts {
<script src="~/Scripts/jquery.signalR-2.1.2.min.js"></script>
<script src="/signalr/hubs"></script>
<script>
$(document).ready(function () {
/*
/ Hub
*/
// Setup hub connection
var hub = $.connection.echo;
hub.client.getonlinefriends = function (user, data) {
var result = JSON.parse(data);
for (var i = 0; i < result.length; i++) {
var obj = result[i];
$(".chat." + user + "> ul").append('<li class="cf' + obj.id + '" data-id="' + obj.id + '"><img src="uploads/' + obj.id + '.jpg" /> ' + obj.friend + '</li>');
var chatbox = $("body > .chatbox").clone();
chatbox.attr("data-id", obj.id);
chatbox.attr("id", "cb" + obj.id);
chatbox.addClass("hidden");
chatbox.find("a.sendchat").attr("data-friend", obj.friend);
chatbox.find("a.sendchat").attr("data-id", obj.id);
chatbox.find("div.chatboxtext").attr("id", "cbtext" + obj.id);
$("#chb" + user).append(chatbox);
$("#chb" + user + " #cb" + obj.id + " h4 > span").html('<img src="uploads/' + obj.id + '.jpg" />');
}
}
hub.client.updatechat = function (user, data) {
var result = JSON.parse(data);
$(".chat." + user + "> ul").empty();
for (var i = 0; i < result.length; i++) {
var obj = result[i];
$(".chat." + user + "> ul").append('<li class="cf' + obj.id + '" data-id="' + obj.id + '"><img src="uploads/' + obj.id + '.jpg" /> ' + obj.friend + '</li>');
if (!($(".chatboxholder #cb" + obj.id).length)) {
var chatbox = $("body > .chatbox").clone();
chatbox.attr("data-id", obj.id);
chatbox.attr("id", "cb" + obj.id);
chatbox.addClass("hidden");
chatbox.find("a.sendchat").attr("data-friend", obj.friend);
chatbox.find("a.sendchat").attr("data-id", obj.id);
chatbox.find("div.chatboxtext").attr("id", "cbtext" + obj.id);
$("#chb" + user).append(chatbox);
$("#chb" + user + " #cb" + obj.id + " h4 > span").html('<img src="uploads/' + obj.id + '.jpg" />');
}
}
}
hub.client.sendchat = function (userId, user, friendId, friendUsername, message) {
var a = $("#chb" + user + " div#cb" + friendId + " .chatboxtext");
a.append("<img src=uploads/" + userId + ".jpg /> " + message + "<br />");
a.scrollTop(a.prop("scrollHeight"));
if ($("#chb"+friendUsername + " div#cb"+userId).hasClass("hidden")) {
$('li.cf' + userId).addClass("msg");
}
var b = $("#chb" + friendUsername + " div#cb" + userId + " .chatboxtext");
b.append("<img src=uploads/" + userId + ".jpg /> " + message + "<br />");
b.scrollTop(b.prop("scrollHeight"));
}
// Connect to the hub
$.connection.hub
.start()
.done(function () {
/*
/ Display unread messages
*/
$("body").on("click", "a.sendchat", function (e) {
e.preventDefault();
var $this = $(this);
var friendId = $this.data("id");
var friendUsername = $this.data("friend");
var message = $this.parent().find("textarea").val();
$this.parent().find("textarea").val("");
hub.server.sendChat(friendId, friendUsername, message);
});
$("body").on("keypress", ".chatbox textarea", function (e) {
if (e.which == 13) {
$(this).parent().find("a.sendchat").click();
setTimeout(function () {
$(this).parent().find("textarea").focus();
}, 0);
}
});
});
/*
/ Open chat box
*/
$("body").on("click", ".chat ul li", function () {
var $this = $(this);
if ($this.hasClass("msg")) $this.removeClass("msg");
var friend = $this.text().trim();
var chatboxNumber = $(".chatboxholder .chatbox:not(.hidden)").length;
var id = $this.data("id");
var right = 320;
var cb = $(".chatboxholder #cb" + id);
if (!cb.length) {
cb.css("right", right * chatboxNumber);
} else if (cb.hasClass("hidden")) {
cb.removeClass("hidden");
cb.css("right", right * chatboxNumber);
} else {
cb.addClass("hidden");
cb.css("right", right * chatboxNumber);
}
});
}); // End ready
</script>
}
Layout.cshtml
<div class="chatboxholder" id="chb@(User.Identity.Name)"></div>
<div class="chatbox">
<h4><span></span></h4>
<div class="chatboxtext"></div>
<textarea class="chattextarea"></textarea>
<br />
<a href="#" class="sendchat">send</a>
</div>