public static PlayerDC PlayerToPlayerDC(Player p)
 {
     PlayerDC playerDC = new PlayerDC()
     {
         PlayerDescription = p.PlayerDescription,
         PlayerId = p.PlayerId,
         PlayerStatus = p.PlayerStatus,
         Pseudonym = p.Pseudonym
     };
     using (var db = new BomberDbContext())
     { 
         var q = (from pl in db.Players
                  where pl.PlayerId == playerDC.PlayerId
                  select pl).ToList<Player>();
         if (q.Count > 0)
         {
             var player = q.ElementAt(0);
             playerDC.Login = player.Account.Login;
         }
     }
     return playerDC;
 }
 public static ConversationDC ConversationToConversationDC(Conversation conv)
 {
     ConversationDC convDC = null;
     using (var db = new BomberDbContext())
     {
         var q = (from co in db.Conversations
                   where co.ConversationId == conv.ConversationId
                   select co).ToList();
         if (q.Count > 0)
         {
             var c = q.ElementAt(0);
             convDC = new ConversationDC()
             {
                 ConversationId = c.ConversationId,
                 ConversationLog = c.ConversationLog,
                 Host = PlayerToPlayerDC(c.Host),
                 Participants = PlayersToPlayerDCs(c.Players)
             };
         }
     }
     return convDC;
 }
 public void DeleteConversation(ConversationDC Party)
 {
     using (var db = new BomberDbContext())
     {
         var q = (from c in db.Conversations
                  where c.ConversationId == Party.ConversationId
                  select c).ToList();
         if (q.Count > 0)
         {
             var convToDrop = q.ElementAt(0);
             convToDrop.Players.Clear();
             db.Conversations.DeleteObject(convToDrop);
             db.SaveChanges();
             if (Conversations.Keys.Contains(Party.ConversationId))
             {
                 var cm = Conversations[Party.ConversationId];
                 cm.TriggerEndOfConvEvent();
                 Conversations.Remove(Party.ConversationId);
             }
         }
     }
 }
 public void LeaveConversation(ConversationDC Party)
 {
     using (var db = new BomberDbContext())
     {
         var q = (from c in db.Conversations
                  where c.ConversationId == Party.ConversationId
                  select c).ToList();
         var q1 = (from p in db.Players
                   where p.PlayerId == Player.PlayerId
                   select p).ToList();
         if (q.Count > 0 && q1.Count > 0)
         {
             var conv = q.ElementAt(0);
             var thisPlayer = q1.ElementAt(0);
             conv.Players.Remove(thisPlayer);
             var remainingPlayers = conv.Players.Count;
             if (remainingPlayers == 0)
             {
                 db.Conversations.DeleteObject(conv);
                 if (Conversations.Keys.Contains(Party.ConversationId))
                 {
                     var cm = Conversations[Party.ConversationId];
                     cm.TriggerEndOfConvEvent();
                     Conversations.Remove(Party.ConversationId);
                 }
             }
             else if (Conversations.Keys.Contains(Party.ConversationId))
             {
                 var cm = Conversations[Party.ConversationId];
                 var q2 = (from p in cm.Conv.Participants
                           where p.PlayerId == Player.PlayerId
                           select p).ToList();
                 if (q2.Count > 0)
                 {
                     var p = q2.ElementAt(0);
                     cm.Conv.Participants = cm.Conv.Participants.ToList();
                     ((List<PlayerDC>)cm.Conv.Participants).Remove(p);
                     cm.TriggerLeaveEvent(new PlayerDC() { PlayerId = Player.PlayerId });
                     cm.EndOfConvEvent -= EndOfConvEventHandler;
                     cm.JoinEvent -= JoinConvEventHandler;
                     cm.KickEvent -= KickFromConvEventHandler;
                     cm.LeaveEvent -= LeaveConvEventHandler;
                     cm.MessageEvent -= ConvMessageEventHandler;
                 }
             }
             db.SaveChanges();
         }
     }
 }
 public void SaveProfil(PlayerDC profil)
 {
     using (var db = new BomberDbContext())
     {
         var q = (from p in db.Players
                  where p.PlayerId == Player.PlayerId
                  select p).ToList<Player>();
         if (q.Count > 0)
         {
             var thisPlayer = q.ElementAt(0);
             thisPlayer.Pseudonym = profil.Pseudonym;
             thisPlayer.PlayerDescription = profil.PlayerDescription;
             db.SaveChanges();
             foreach (var friend in thisPlayer.Friends)
             {
                 if (Sessions.Keys.Contains(friend.PlayerId))
                 {
                     Sessions[friend.PlayerId].Callback.NotifyFriendProfilChange(EntityContractTranslator.PlayerToPlayerDC(thisPlayer));
                 }
             }
         }
     }
 }
 public void CreateConversation(ConversationDC newConv)
 {
     using (var db = new BomberDbContext())
     {
         var q = (from p in db.Players
                  where p.PlayerId == newConv.Host.PlayerId
                  select p).ToList();
         var convMembersIds = from i in newConv.Participants
                              select i.PlayerId;
         var convMembers = (from p in db.Players
                            where convMembersIds.Contains(p.PlayerId)
                            select p);
         if (q.Count > 0)
         {
             var host = q.ElementAt(0);
             Conversation c = new Conversation()
             {
                 Host = host,
                 ConversationLog = ""
             };
             // discussion : add the host to c.Players or not? let's say no, for now...
             foreach (var p in convMembers)
             {
                 if (!c.Players.Contains(p))
                     c.Players.Add(p);
             }
             db.Conversations.AddObject(c);
             db.SaveChanges();
             var convDC = EntityContractTranslator.ConversationToConversationDC(c);
             var cm = new ConversationManager(convDC);
             Conversations.Add(convDC.ConversationId, cm);
             if (Sessions.Keys.Contains(host.PlayerId))
             {
                 var s = Sessions[host.PlayerId];
                 cm.EndOfConvEvent += s.EndOfConvEventHandler;
                 cm.JoinEvent += s.JoinConvEventHandler;
                 cm.KickEvent += s.KickFromConvEventHandler;
                 cm.LeaveEvent += s.LeaveConvEventHandler;
                 cm.MessageEvent += s.ConvMessageEventHandler;
                 s.Callback.InitializeConversation(convDC);
             }
             foreach (var p in convMembers)
             {
                 if (Sessions.Keys.Contains(p.PlayerId))
                 {
                     var s = Sessions[p.PlayerId];
                     cm.EndOfConvEvent += s.EndOfConvEventHandler;
                     cm.JoinEvent += s.JoinConvEventHandler;
                     cm.KickEvent += s.KickFromConvEventHandler;
                     cm.LeaveEvent += s.LeaveConvEventHandler;
                     cm.MessageEvent += s.ConvMessageEventHandler;
                     s.Callback.InitializeConversation(convDC);
                 }
             }
         }
     }
 }
 public void RemoveFriend(PlayerDC friend)
 {
     using (var db = new BomberDbContext())
     {
         var q = (from p in db.Players
                  where p.PlayerId == Player.PlayerId
                  select p).ToList();
         var q1 = (from p in db.Players
                   where p.PlayerId == friend.PlayerId
                   select p).ToList();
         if (q.Count > 0 && q1.Count > 0)
         {
             var thisPlayer = q.ElementAt(0);
             var friendPlayer = q1.ElementAt(0);
             thisPlayer.Friends.Remove(friendPlayer);
             friendPlayer.Friends.Remove(thisPlayer);
             db.SaveChanges();
             Callback.NotifyFriendshipEnding(EntityContractTranslator.PlayerToPlayerDC(friendPlayer));
             if (Sessions.Keys.Contains(friendPlayer.PlayerId))
                 Sessions[friendPlayer.PlayerId].Callback.NotifyFriendshipEnding(EntityContractTranslator.PlayerToPlayerDC(thisPlayer));
         }
     }
 }
 public void TerminateSession()
 {
     if (ConnexionDenied)
         return;
     using (var db = new BomberDbContext())
     {
         var q = from p in db.Players
                 where p.PlayerId == Player.PlayerId
                 select p;
         if (q.Count() > 0)
         {
             var p = q.ToList().ElementAt(0);
             p.PlayerStatus = "Offline";
             db.SaveChanges();
             var q2 = from f in p.Friends
                      where Sessions.Keys.Contains(f.PlayerId)
                      select f;
             foreach (var f in q2)
             {
                 var session = Sessions[f.PlayerId];
                 session.Callback.NotifyPlayerStatusChange(EntityContractTranslator.PlayerToPlayerDC(p));
             }
             Sessions.Remove(Player.PlayerId);
         }
     }
     foreach (var cm in Conversations)
     {
         var participantsIds = from c in cm.Value.Conv.Participants
                               select c.PlayerId;
         if (cm.Value.Conv.Host.PlayerId == Player.PlayerId || participantsIds.Contains(Player.PlayerId))
         {
             cm.Value.EndOfConvEvent -= EndOfConvEventHandler;
             cm.Value.JoinEvent -= JoinConvEventHandler;
             cm.Value.KickEvent -= KickFromConvEventHandler;
             cm.Value.LeaveEvent -= LeaveConvEventHandler;
             cm.Value.MessageEvent -= ConvMessageEventHandler;
         }
     }
 }
 public void AcceptFriendshipRequest(PlayerDC playerDC)
 {
     using (var db = new BomberDbContext())
     {
         var q = (from p in db.Players
                  where p.PlayerId == Player.PlayerId
                  select p).ToList();
         var q1 = (from p in db.Players
                   where p.PlayerId == playerDC.PlayerId
                   select p).ToList();
         if (q.Count > 0 && q1.Count > 0)
         {
             var thisPlayer = q.ElementAt(0);
             var player = q1.ElementAt(0);
             thisPlayer.PlayersRequestingFriendship.Remove(player);
             if (!thisPlayer.Friends.Contains(player))
                 thisPlayer.Friends.Add(player);
             if (!player.Friends.Contains(thisPlayer))
                 player.Friends.Add(thisPlayer);
             db.SaveChanges();
             Callback.NotifyFriendshipEstablishment(playerDC);
             if (Sessions.Keys.Contains(player.PlayerId))
                 Sessions[player.PlayerId].Callback.NotifyFriendshipEstablishment(EntityContractTranslator.PlayerToPlayerDC(thisPlayer));
         }
     }
 }
 public void StartSession(AccountDC a)
 {
     Callback = OperationContext.Current.GetCallbackChannel<IBomberCallback>();
     using (var db = new BomberDbContext())
     {
         var query = from ac in db.Accounts
                     where ac.Login == a.Login
                     && ac.Password == a.Password
                     select ac;
         if (query.Count() == 0)
         {
             Callback.RejectConnection();
             ConnexionDenied = true;
         }
         else
         {
             var p = query.ToList<Account>().ElementAt(0).Player;
             if (Sessions.Keys.Contains(p.PlayerId))
             {
                 p.PlayerStatus = "Offline";
                 db.SaveChanges();
                 Sessions[p.PlayerId].Callback.DisconnectPlayer();
                 Callback.DisconnectPlayer();
                 return;
             }
             p.PlayerStatus = "Online";
             db.SaveChanges();
             Sessions.Add(p.PlayerId, this);
             this.Player = p;
             var profil = EntityContractTranslator.PlayerToPlayerDC(p);
             var friendShipRequests = EntityContractTranslator.PlayersToPlayerDCs(p.PlayersRequestingFriendship);
             //notifying connected friends:
             var connectedFriends = from f in p.Friends
                                    where Sessions.Keys.Contains(f.PlayerId)
                                    select f;
             foreach (var f in connectedFriends)
             {
                 var session = Sessions[f.PlayerId];
                 session.Callback.NotifyPlayerStatusChange(profil);
             }
             //retrieving conversations
             List<Conversation> convs = new List<Conversation>();
             foreach (var c in db.Conversations)
             {
                 if (c.Host.PlayerId == p.PlayerId || (from pl in c.Players select pl.PlayerId).Contains(p.PlayerId))
                     convs.Add(c);
             }
             List<ConversationDC> playerConvDCs = new List<ConversationDC>();
             if (convs.Count > 0)
             {
                 foreach (var c in convs)
                 {
                     ConversationManager cm = null;
                     if (Conversations.Keys.Contains(c.ConversationId))
                     {
                         cm = Conversations[c.ConversationId];
                     }
                     else
                     {
                         cm = new ConversationManager(new ConversationDC()
                         {
                             ConversationId = c.ConversationId,
                             Host = EntityContractTranslator.PlayerToPlayerDC(c.Host),
                             ConversationLog = c.ConversationLog,
                             Participants = EntityContractTranslator.PlayersToPlayerDCs(c.Players),
                             NewMessage = ""
                         });
                         Conversations.Add(cm.Conv.ConversationId, cm);
                     }
                     playerConvDCs.Add(cm.Conv);
                     cm.EndOfConvEvent += EndOfConvEventHandler;
                     cm.JoinEvent += JoinConvEventHandler;
                     cm.KickEvent += KickFromConvEventHandler;
                     cm.LeaveEvent += LeaveConvEventHandler;
                     cm.MessageEvent += ConvMessageEventHandler;
                 }
             }
             Callback.ReceiveProfil(profil, friendShipRequests, playerConvDCs);
         }
     }
 }
 public void RefuseFriendshipRequest(PlayerDC playerDC)
 {
     using (var db = new BomberDbContext())
     {
         var q = (from p in db.Players
                  where p.PlayerId == Player.PlayerId
                  select p).ToList<Player>();
         var q1 = (from p in db.Players
                   where p.PlayerId == playerDC.PlayerId
                   select p).ToList<Player>();
         if (q.Count > 0 && q1.Count > 0)
         {
             var thisPlayer = q.ElementAt(0);
             var player = q1.ElementAt(0);
             thisPlayer.PlayersRequestingFriendship.Remove(player);
             db.SaveChanges();
         }
     }
 }
 public void SendFriendshipRequests(IEnumerable<PlayerDC> players)
 {
     using (var db = new BomberDbContext())
     {
         var q = (from p in db.Players
                  where p.PlayerId == Player.PlayerId
                  select p).ToList<Player>();
         if (q.Count > 0)
         {
             var thisPlayer = q.ElementAt(0);
             foreach (var p in players)
             {
                 var q1 = (from pl in db.Players
                           where pl.PlayerId == p.PlayerId
                           select pl).ToList<Player>();
                 if (q1.Count > 0)
                 {
                     var player = q1.ElementAt(0);
                     var q2 = (from r in thisPlayer.FriendshipRequestedPlayers
                               where r.PlayerId == player.PlayerId
                               select r).ToList().Count;
                     if (q2 == 0)
                     {
                         thisPlayer.FriendshipRequestedPlayers.Add(player);
                         if (Sessions.Keys.Contains(player.PlayerId))
                             Sessions[player.PlayerId].Callback.NotifyFriendshipRequest(EntityContractTranslator.PlayerToPlayerDC(thisPlayer));
                     }
                 }
             }
             db.SaveChanges();
             Callback.NotifyFriendshipRequestSuccess();
         }
     }
 }
 public void SearchFriends(PlayerDC refPlayer)
 {
     using (var db = new BomberDbContext())
     {
         var q = (from p in db.Players
                  where p.PlayerId == Player.PlayerId
                  select p).ToList<Player>();
         if (q.Count > 0)
         {
             var player = q.ElementAt(0);
             var q1 = (from a in db.Accounts
                       where a.Login.Contains(refPlayer.Login)
                       select a);
             var players = from a in q1
                           where a.Player.Pseudonym.Contains(refPlayer.Pseudonym)
                           select a.Player;
             var friendsIds = from f in player.Friends
                              select f.PlayerId;
             var playersRequestingFriendshipIds = from f in player.PlayersRequestingFriendship
                                                  select f.PlayerId;
             var potentielNewFriends = from p in players
                                       where !friendsIds.Contains(p.PlayerId)
                                       && !playersRequestingFriendshipIds.Contains(p.PlayerId)
                                       && p.PlayerId != Player.PlayerId
                                       select p;
             Callback.ReceiveSearchFriendsResult(EntityContractTranslator.PlayersToPlayerDCs(potentielNewFriends));
         }
     }
 }
 public void RequestFriends()
 {
     using (var db = new BomberDbContext())
     {
         var query = (from pl in db.Players
                      where pl.PlayerId == Player.PlayerId
                      select pl).ToList<Player>();
         if (query.Count > 0)
         {
             var p = query.ElementAt(0);
             var friends = EntityContractTranslator.PlayersToPlayerDCs(p.Friends);
             Callback.ReceiveFriendsList(friends);
         }
     }
 }
 public void CreateAccount(AccountDC newAccount, PlayerDC player)
 {
     Callback = OperationContext.Current.GetCallbackChannel<IBomberCallback>();
     using (var db = new BomberDbContext())
     {
         var p = new Player()
         {
             Pseudonym = player.Pseudonym,
             PlayerStatus = "Offline",
             PlayerDescription = player.PlayerDescription
         };
         var a = new Account()
         {
             Login = newAccount.Login,
             Password = newAccount.Password,
             AccountType = "normal",
             Player = p
         };
         p.Account = a;
         db.Accounts.AddObject(a);
         db.Players.AddObject(p);
         try
         {
             db.SaveChanges();
             Callback.NotifySubscriptionSuccess();
         }
         catch
         {
             Callback.RefuseSubscription();
         }
     }
 }