示例#1
0
 public Room CreateRoom(LoginToken token, string password = null)
 {
     if (VerifyClient(token))
     {
         while (rooms.ContainsKey(roomId))
         {
             roomId++;
         }
         Room room = new Room();
         for (int i = 0; i < 8; i++)
         {
             room.Seats.Add(new Seat() { Ready = false, Disabled = false });
         }
         room.Seats[0].Account = loggedInGuidToAccount[token.token];
         room.Id = roomId;
         rooms.Add(roomId, room);
         if (loggedInGuidToRoom.ContainsKey(token.token))
         {
             loggedInGuidToRoom.Remove(token.token);
         }
         loggedInGuidToRoom.Add(token.token, room);
         Console.WriteLine("created room {0}", roomId);
         return room;
     }
     Console.WriteLine("Invalid createroom call");
     return null;
 }
示例#2
0
 public int EnterRoom(LoginToken token, int roomId, bool spectate, string password = null)
 {
     if (VerifyClient(token))
     {
         if (rooms.ContainsKey(roomId))
         {
                 if (rooms[roomId].InProgress) return -1;
                 int seatNo = 1;
                 foreach (var seat in rooms[roomId].Seats)
                 {
                     if (seat.Account == null)
                     {
                         if (loggedInGuidToRoom.ContainsKey(token.token))
                         {
                             loggedInGuidToRoom.Remove(token.token);
                         }
                         loggedInGuidToRoom.Add(token.token, rooms[roomId]);
                         seat.Account = loggedInGuidToAccount[token.token];
                         foreach (var notify in rooms[roomId].Seats)
                         {
                             loggedInGuidToChannel[loggedInAccountToGuid[notify.Account]].NotifyRoomUpdate(rooms[roomId].Id, rooms[roomId]);
                         }
                         return seatNo;
                     }
                     seatNo++;
                 }
                 return (int)RoomOperationResult.Full;
         }
     }
     return (int)RoomOperationResult.Auth;
 }
示例#3
0
 private bool VerifyClient(LoginToken token)
 {
     if (loggedInGuidToAccount.ContainsKey(token.token))
     {
         if (loggedInGuidToChannel.ContainsKey(token.token))
         {
             if (loggedInGuidToChannel[token.token] == OperationContext.Current.GetCallbackChannel<IGameClient>())
             {
                 return true;
             }
         }
     }
     return false;
 }
示例#4
0
 public void Logout(LoginToken token)
 {
     if (VerifyClient(token))
     {
         Console.WriteLine("{0} logged out", loggedInGuidToAccount[token.token].Username);
         loggedInGuidToAccount.Remove(token.token);
     }
 }
示例#5
0
 public LoginStatus Login(int version, string username, out LoginToken token)
 {
     Console.WriteLine("{0} logged in", username);
     var connection = OperationContext.Current.GetCallbackChannel<IGameClient>();
     token = new LoginToken();
     token.token = System.Guid.NewGuid();
     Account account = new Account() { Username = username };
     loggedInGuidToAccount.Add(token.token, account);
     loggedInGuidToChannel.Add(token.token, connection);
     loggedInAccountToGuid.Add(account, token.token);
     loggedInChannelsToGuid.Add(connection, token.token);
     return LoginStatus.Success;
 }
示例#6
0
 public IEnumerable<Room> GetRooms(LoginToken token, bool notReadyRoomsOnly)
 {
     if (VerifyClient(token))
     {
         List<Room> ret = new List<Room>();
         foreach (var pair in rooms)
         {
             if (!notReadyRoomsOnly || !pair.Value.InProgress)
             {
                 ret.Add(pair.Value);
             }
         }
         return ret;
     }
     return null;
 }
示例#7
0
 public bool ExitRoom(LoginToken token, int roomId)
 {
     if (VerifyClient(token))
     {
         if (loggedInGuidToRoom.ContainsKey(token.token))
         {
             foreach (var seat in loggedInGuidToRoom[token.token].Seats)
             {
                 if (seat.Account == loggedInGuidToAccount[token.token])
                 {
                     seat.Account = null;
                     foreach (var notify in rooms[roomId].Seats)
                     {
                         loggedInGuidToChannel[loggedInAccountToGuid[notify.Account]].NotifyRoomUpdate(rooms[roomId].Id, rooms[roomId]);
                     }
                     loggedInGuidToRoom.Remove(token.token);
                     return true;
                 }
             }
         }
     }
     return false;
 }