using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using Holo.Virtual.Users; using Holo.Socketservers; using Holo.GameConnectionSystem; using Holo.Source.Managers; using Ion.Storage; namespace Holo.Source.GameConnectionSystem { public class gameConnection { #region Declares private Socket ClientSocket; private byte[] dataBuffer; private int _ConnectionID; private virtualUser EndUser; private delegate void Handeler(); private Handeler[] mPacket; private string currentPacket; private bool SocketClosed = false; private string ipNumber; #endregion #region Constructor public gameConnection(Socket _ClientSocket, int _ConnectionID, string ip) { this.ipNumber = ip; mPacket = new Handeler[2003]; this.EndUser = new virtualUser(this); this.ClientSocket = _ClientSocket; this._ConnectionID = _ConnectionID; this.dataBuffer = new byte[1024]; RegisterStandardPackets(); this.ClientSocket.BeginReceive(this.dataBuffer, 0, this.dataBuffer.Length, SocketFlags.None, new AsyncCallback(this.dataArrival), null); EndUser.pingOK = true; sendData("@@"); } #endregion #region Properities internal string connectionRemoteIP { get { return ClientSocket.RemoteEndPoint.ToString().Split(':')[0]; } } #endregion #region Methods /// /// Check the status of the user after an error /// /// The exception the user got internal void PreformStatusCheck(Exception Message) { try { if (this.ClientSocket.Connected == false) { Close(); //Out.WriteLine("Connection" + _ConnectionID + " is dead"); } else { EndUser.sendNotify("Er is een foutje bij jou voorgekomen!\\rJe bent naar het hotel overzicht geplaatst zodat je niet opnieuw hoeft in te loggen!\\rJe fout is ook meteen opgenomen :)\\rSorry voor het ongemak"); EndUser.pingOK = true; sendData("@@"); //Out.WriteLine("Connection" + _ConnectionID + " is ready for connections"); if (EndUser.Room != null) EndUser.leaveCurrentRoom("Er is een fout bij jou gebeurd, herlaad de kamer aub!", true); } } catch { } } /// /// A new packet of data arrives /// /// The a-synch connection result internal void dataArrival(IAsyncResult iAr) { try { int bytesReceived = new int(); try { bytesReceived = ClientSocket.EndReceive(iAr); } catch { Close(); return; } StringBuilder DataBuffer = new StringBuilder(); DataBuffer.Append(System.Text.Encoding.Default.GetString(dataBuffer, 0, bytesReceived)); if (DataBuffer.ToString().Length < 3 || DataBuffer.ToString().Contains('\x01')) { Close(); return; } while (DataBuffer.Length > 3) { //Out.WriteSpecialLine(DataBuffer.ToString().Replace("\r", "{13}") , Out.logFlags.MehAction, ConsoleColor.Blue, ConsoleColor.Red, "> []", 5, ConsoleColor.Yellow); int v = Encoding.decodeB64(DataBuffer.ToString().Substring(1, 2)); procesPacket(DataBuffer.ToString().Substring(3, v)); DataBuffer.Remove(0, 3 + v); } } catch (Exception e) { if (errorOnce) { Out.WriteDCError(e.ToString() + "\r\nRoomID = " + EndUser._roomID + " - UserID " + EndUser._Username); PreformStatusCheck(e); errorOnce = false; } else { //Close(); } } finally { try { ClientSocket.BeginReceive(dataBuffer, 0, dataBuffer.Length, SocketFlags.None, new AsyncCallback(dataArrival), null ); } catch { Close(); } } } bool errorOnce = true; /// /// Returns the packet to the user /// /// internal string getPacket() { return this.currentPacket; } /// /// Closes the current connection, disconnecting the user /// internal void Close() { if (!SocketClosed) { SocketClosed = true; try { ClientSocket.Shutdown(SocketShutdown.Both); ClientSocket.Close(); gameSocketServer.freeConnection(_ConnectionID); } catch (Exception e) { Out.WriteDCError(e.ToString()); } EndUser.Reset(); } } /// /// Sends data to the user /// /// The data to be send internal void sendData(string Data) { try { //Out.WriteSpecialLine(Data.Replace("\r", "{13}\r").Replace("\x2", "{2}") + "{1}", Out.logFlags.MehAction, ConsoleColor.White, ConsoleColor.DarkCyan, "> []", 2, ConsoleColor.Cyan); byte[] dataBytes = System.Text.Encoding.Default.GetBytes(Data + Convert.ToChar(1)); ClientSocket.BeginSend(dataBytes, 0, dataBytes.Length, 0, new AsyncCallback(sentData), null); } catch { Close(); } } /// /// Same as sendData /// /// internal void sentData(IAsyncResult iAr) { try { ClientSocket.EndSend(iAr); } catch { Close(); } } /// /// The id of this connection /// internal int ConnectionID { get { return this._ConnectionID; } } /// /// The packet enters the method! /// /// the packet! internal void procesPacket(string thePacket) { currentPacket = thePacket; int packetID = Encoding.decodeB64(thePacket.Substring(0, 2)); if (mPacket[packetID] != null) { //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) //{ // dbClient.AddParamWithValue("packet", thePacket); // dbClient.runQuery("INSERT INTO packet_log SET userid = " + this.EndUser.userID + ", packet = @packet"); //} mPacket[packetID].Invoke(); } } /// /// Sends an error to the user /// /// The error ID internal void sendError(int error, string additionalInformation) { switch (error) { case errorList.COST_ERROR: sendData("AD"); break; case errorList.USER_NOT_EXIST: sendData("AL" + additionalInformation); break; case errorList.FURNITURE_IS_IN_ROOM: sendData("BKDeze meubel is al in de kamer!"); break; case errorList.PETNAME_IN_ROOM: sendData("BKEr is al een huisdier met dezelfde naam in de kamer!"); break; case errorList.TOO_MUCH_PETS: sendData("BKJe kan maar 3 huisdieren in je kamer hebben!"); break; case errorList.SOUNDMACHINE_IN_ROOM: sendData("BKJe kan maar 1 trax-player in je kamer hebben."); break; } } #endregion #region Packet registry /// /// Standard non-logged in packets /// internal void RegisterStandardPackets() { mPacket[196] = new Handeler(EndUser.pingReceived); mPacket[204] = new Handeler(EndUser.initializePlayer); mPacket[206] = new Handeler(EndUser.cnReceived); mPacket[2002] = new Handeler(EndUser.packetSSO); } /// /// All packets for logged-in users /// internal void RegisterLoggedInPackets() { mPacket = new Handeler[2003]; mPacket[2] = new Handeler(EndUser.getRoomState); mPacket[7] = new Handeler(EndUser.refreshAppearance); mPacket[8] = new Handeler(EndUser.refreshValuables); mPacket[12] = new Handeler(EndUser.initializeMessenger); mPacket[15] = new Handeler(EndUser.refreshFriendlist); mPacket[16] = new Handeler(EndUser.getOwnRooms); mPacket[17] = new Handeler(EndUser.guestroomSearch); mPacket[18] = new Handeler(EndUser.getFavoriteRooms); mPacket[19] = new Handeler(EndUser.addFavouriteRooms); mPacket[20] = new Handeler(EndUser.removeFavouriteRoom); mPacket[21] = new Handeler(EndUser.getGuestroomDetails); mPacket[23] = new Handeler(EndUser.deleteGuestroom); mPacket[24] = new Handeler(EndUser.modifyRoomNameDetails); mPacket[25] = new Handeler(EndUser.createGuestroomPhaseTwo); mPacket[26] = new Handeler(EndUser.refreshClubPacket); mPacket[28] = new Handeler(EndUser.doTeleporterFlash); mPacket[29] = new Handeler(EndUser.createGuestroomPhaseOne); mPacket[33] = new Handeler(EndUser.sendInstantMessagetoBuddy); mPacket[34] = new Handeler(EndUser.massInvite); mPacket[37] = new Handeler(EndUser.acceptFriendRequests); mPacket[38] = new Handeler(EndUser.declineFriendRequests); mPacket[39] = new Handeler(EndUser.messengerFriendRequest); mPacket[40] = new Handeler(EndUser.removeBuddyFromFriendlist); mPacket[41] = new Handeler(EndUser.searchInConsole); mPacket[42] = new Handeler(EndUser.validatePetName); mPacket[48] = new Handeler(EndUser.pickupCFH); mPacket[49] = new Handeler(EndUser.dateRequest); mPacket[52] = new Handeler(EndUser.talkInsideRoom); mPacket[53] = new Handeler(EndUser.leaveCurrentRoom); mPacket[54] = new Handeler(EndUser.enterRoomUsingTeleporter); mPacket[55] = new Handeler(EndUser.talkInsideRoom); mPacket[56] = new Handeler(EndUser.whisperToPlayer); mPacket[57] = new Handeler(EndUser.enterCheckRoom); mPacket[59] = new Handeler(EndUser.getGuestroomData); mPacket[60] = new Handeler(EndUser.getRoomClass); mPacket[61] = new Handeler(EndUser.getRoomItems); mPacket[62] = new Handeler(EndUser.getGroupSkillLevelsAndGroupBadges); mPacket[63] = new Handeler(EndUser.getGuestroomWallItems); mPacket[64] = new Handeler(EndUser.enterRoom); mPacket[65] = new Handeler(EndUser.getHand); mPacket[66] = new Handeler(EndUser.applyNewDecoration); mPacket[67] = new Handeler(EndUser.removeItemFromRoom); mPacket[68] = new Handeler(EndUser.declineTrade); mPacket[69] = new Handeler(EndUser.acceptTrade); mPacket[70] = new Handeler(EndUser.abortTrade); mPacket[71] = new Handeler(EndUser.startTrading); mPacket[72] = new Handeler(EndUser.offerTradeItem); mPacket[73] = new Handeler(EndUser.rotateItemInRoom); mPacket[74] = new Handeler(EndUser.toggleFloorItemStatus); mPacket[75] = new Handeler(EndUser.walkToNewSquare); mPacket[76] = new Handeler(EndUser.spinDice); mPacket[77] = new Handeler(EndUser.closeDice); mPacket[78] = new Handeler(EndUser.openPresentBox); mPacket[79] = new Handeler(EndUser.rotateUser); mPacket[80] = new Handeler(EndUser.carryNewItem); mPacket[81] = new Handeler(EndUser.goEnterTeleporter); mPacket[83] = new Handeler(EndUser.openStickyOrPhoto); mPacket[84] = new Handeler(EndUser.editSticky); mPacket[85] = new Handeler(EndUser.deleteSticky); mPacket[86] = new Handeler(EndUser.sendCFH); mPacket[88] = new Handeler(EndUser.removeStatus); mPacket[90] = new Handeler(EndUser.placeItemInRoom); mPacket[93] = new Handeler(EndUser.doNewDance); mPacket[94] = new Handeler(EndUser.statusWave); mPacket[95] = new Handeler(EndUser.kickUserFromRoom); mPacket[96] = new Handeler(EndUser.giveRightsToPlayer); mPacket[97] = new Handeler(EndUser.removeRights); mPacket[98] = new Handeler(EndUser.awnserDoorbell); mPacket[100] = new Handeler(EndUser.doPurchase); mPacket[101] = new Handeler(EndUser.sendIndexPage); mPacket[102] = new Handeler(EndUser.openPageContent); mPacket[104] = new Handeler(EndUser.voteForLido); mPacket[105] = new Handeler(EndUser.buyIngameTickets); mPacket[106] = new Handeler(EndUser.dive); mPacket[107] = new Handeler(EndUser.splashDive); mPacket[115] = new Handeler(EndUser.walkToDoor); mPacket[116] = new Handeler(EndUser.newSwimmingOutfit); mPacket[126] = new Handeler(EndUser.getRoomAdvertise); mPacket[128] = new Handeler(EndUser.getPetInformation); mPacket[129] = new Handeler(EndUser.redeemCreditCode); mPacket[150] = new Handeler(EndUser.navigateThroughCategorie); mPacket[151] = new Handeler(EndUser.requestNavigatorIndex); mPacket[152] = new Handeler(EndUser.triggerGuestroomModify); mPacket[153] = new Handeler(EndUser.modifyRoomCategory); mPacket[154] = new Handeler(EndUser.getUserlistInsideRoom); mPacket[157] = new Handeler(EndUser.initializeBadges); mPacket[158] = new Handeler(EndUser.badgeOnOff); mPacket[159] = new Handeler(EndUser.refreshGameList); mPacket[160] = new Handeler(EndUser.getSingeleGameSub); mPacket[162] = new Handeler(EndUser.createNewGame); mPacket[163] = new Handeler(EndUser.procesNewGame); mPacket[165] = new Handeler(EndUser.switchTeamsInGame); mPacket[167] = new Handeler(EndUser.leaveGame); mPacket[168] = new Handeler(EndUser.kickPlayerFromGame); mPacket[170] = new Handeler(EndUser.startGameFromLoby); mPacket[171] = new Handeler(EndUser.movePlayerInGame); mPacket[172] = new Handeler(EndUser.proceedStartGame); mPacket[182] = new Handeler(EndUser.loadAdvertisement); mPacket[183] = new Handeler(EndUser.redeemCreditItem); mPacket[196] = new Handeler(EndUser.pingReceived); mPacket[198] = new Handeler(EndUser.moderatorDeleteCFH); mPacket[199] = new Handeler(EndUser.replyToCFH); mPacket[200] = new Handeler(EndUser.useModTool); mPacket[214] = new Handeler(EndUser.toggleWallItemStatus); mPacket[219] = new Handeler(EndUser.addSoundsetToSoundmachine); mPacket[220] = new Handeler(EndUser.removeSoundSetFromMachine); mPacket[221] = new Handeler(EndUser.getSongDetails); mPacket[222] = new Handeler(EndUser.recyclerSetup); mPacket[223] = new Handeler(EndUser.recyclerSessionStatus); mPacket[225] = new Handeler(EndUser.addRecyclerJob); mPacket[226] = new Handeler(EndUser.redeemRecyclerJob); mPacket[228] = new Handeler(EndUser.refreshGroup); mPacket[231] = new Handeler(EndUser.getGroupDetails); mPacket[237] = new Handeler(EndUser.receivedCFH); mPacket[238] = new Handeler(EndUser.deleteCFH); mPacket[239] = new Handeler(EndUser.initializeSoundSetPreview); mPacket[240] = new Handeler(EndUser.saveSoundmachineSong); mPacket[241] = new Handeler(EndUser.requestExistingSongSoundMachine); mPacket[242] = new Handeler(EndUser.saveEdittedSongSoundMachine); mPacket[243] = new Handeler(EndUser.savePlaylistSoundMachine); mPacket[244] = new Handeler(EndUser.initializeSoundMachine); mPacket[245] = new Handeler(EndUser.initializePlaylists); mPacket[247] = new Handeler(EndUser.spinWheelOfFortune); mPacket[248] = new Handeler(EndUser.deleteSongFromMachine); mPacket[254] = new Handeler(EndUser.burnSongToList); mPacket[261] = new Handeler(EndUser.voteForRoom); mPacket[262] = new Handeler(EndUser.stalkButtonMessenger); mPacket[263] = new Handeler(EndUser.getTagsOfUser); mPacket[264] = new Handeler(EndUser.requestRandomRooms); mPacket[314] = new Handeler(EndUser.activateLoveSofa); mPacket[315] = new Handeler(EndUser.checkEventCategory); mPacket[317] = new Handeler(EndUser.sendSpeechBubble); mPacket[318] = new Handeler(EndUser.hideChatBubble); mPacket[320] = new Handeler(EndUser.kickAndRoomBan); mPacket[321] = new Handeler(EndUser.getEventsData); mPacket[323] = new Handeler(EndUser.getCFHroomID); mPacket[341] = new Handeler(EndUser.loadMoodlightSettings); mPacket[342] = new Handeler(EndUser.applyMoodlightSettings); mPacket[343] = new Handeler(EndUser.toggleMoodLight); mPacket[345] = new Handeler(EndUser.showEventButton); mPacket[346] = new Handeler(EndUser.createNewEvent); mPacket[347] = new Handeler(EndUser.endEvent); mPacket[350] = new Handeler(EndUser.openEventCategory); //mPacket[362] = new Handeler(EndUser.enableGuide); //mPacket[363] = new Handeler(EndUser.disableGuide); mPacket[387] = new Handeler(EndUser.playMiniGame); mPacket[559] = new Handeler(EndUser.editCurrentEvent); mPacket[770] = new Handeler(EndUser.getHand); } #endregion } }