├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .dockerignore ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── custom.md ├── README.MD ├── labeler.yml └── workflows │ ├── cd-cdkey.yml │ ├── cd-chat.yml │ ├── cd-gs.yml │ ├── cd-gtr.yml │ ├── cd-nn.yml │ ├── cd-pcm.yml │ ├── cd-psp.yml │ ├── cd-qr.yml │ ├── cd-sb.yml │ ├── cd-ws.yml │ ├── ci.yml │ └── labeler.yml ├── .gitignore ├── .vscode ├── launch.json └── tasks.json ├── BuildUniSpyServer.bat ├── BuildUniSpyServer.sh ├── CONTRIBUTING.md ├── LICENSE ├── UniSpy.Server.sln ├── common ├── DatabaseModelGenerator │ ├── GenerateDatabaseModelLinux.sh │ └── GenerateDatabaseModelWindows.bat ├── Icon │ └── UniSpy_Logo.ico ├── UniSpy.sql ├── UniSpyServerConfig.json ├── UniSpy_pg.sql └── docker-compose.build.yml └── src ├── Libraries ├── Core │ └── src │ │ ├── Abstraction │ │ ├── BaseClass │ │ │ ├── ClientBase.cs │ │ │ ├── ClientInfoBase.cs │ │ │ ├── ClientManagerBase.cs │ │ │ ├── CmdHandlerBase.cs │ │ │ ├── CmdSwitcherBase.cs │ │ │ ├── EncParamBase.cs │ │ │ ├── RedisChannel.cs │ │ │ ├── RedisClient.cs │ │ │ ├── RedisKeyValueObject.cs │ │ │ ├── RequestBase.cs │ │ │ ├── ResponseBase.cs │ │ │ ├── ResultBase.cs │ │ │ ├── ServerBase.cs │ │ │ └── ServerLauncherBase.cs │ │ └── Interface │ │ │ ├── IClient.cs │ │ │ ├── IConnection.cs │ │ │ ├── IEncryption.cs │ │ │ ├── IHandler.cs │ │ │ ├── IHttpRequest.cs │ │ │ ├── ILogger.cs │ │ │ ├── IRedisChannelEvent.cs │ │ │ ├── IRequest.cs │ │ │ ├── IResponse.cs │ │ │ ├── IServer.cs │ │ │ └── ISwicher.cs │ │ ├── Config │ │ ├── ConfigManager.cs │ │ └── UniSpyConfig.cs │ │ ├── Database │ │ ├── DatabaseModel │ │ │ ├── Addrequest.cs │ │ │ ├── Blocked.cs │ │ │ ├── Friend.cs │ │ │ ├── Game.cs │ │ │ ├── Grouplist.cs │ │ │ ├── Message.cs │ │ │ ├── Partner.cs │ │ │ ├── Profile.cs │ │ │ ├── Pstorage.cs │ │ │ ├── Sakestorage.cs │ │ │ ├── Subprofile.cs │ │ │ ├── UnispyContext.cs │ │ │ └── User.cs │ │ └── DatabaseType.cs │ │ ├── Encryption │ │ ├── Crc16.cs │ │ ├── GSEncryption.cs │ │ ├── UniSpyEncoding.cs │ │ └── XorEncoding.cs │ │ ├── Exception │ │ └── UniSpyException.cs │ │ ├── Extension │ │ ├── DataOperationExtensions.cs │ │ ├── EasyTimer.cs │ │ ├── Redis │ │ │ ├── RedisChannelName.cs │ │ │ └── RedisDbNumber.cs │ │ └── StringExtensions.cs │ │ ├── Logging │ │ └── LogWriter.cs │ │ ├── Misc │ │ ├── BufferCacheBase.cs │ │ ├── GameSpyRandom.cs │ │ ├── GameSpyUtils.cs │ │ ├── PasswordEncoder.cs │ │ ├── RequestChecker.cs │ │ └── UniSpyJsonConverter.cs │ │ ├── Network │ │ ├── Http │ │ │ └── Server │ │ │ │ ├── HttpConnection.cs │ │ │ │ ├── HttpConnectionManager.cs │ │ │ │ └── HttpRequest.cs │ │ ├── NetworkEvents.cs │ │ ├── Tcp │ │ │ ├── Client │ │ │ │ └── UniSpyTcpClient.cs │ │ │ └── Server │ │ │ │ ├── TcpConnection.cs │ │ │ │ └── TcpConnectionManager.cs │ │ └── Udp │ │ │ ├── Client │ │ │ └── UniSpyUdpClient.cs │ │ │ └── Server │ │ │ ├── UdpConnection.cs │ │ │ └── UdpConnectionManager.cs │ │ └── UniSpy.Server.Core.csproj └── LinqToRedis │ ├── .gitignore │ ├── LinqToRedis.sln │ ├── README.md │ ├── src │ ├── Core │ │ ├── IRedisKey.cs │ │ ├── RedisClient.cs │ │ ├── RedisKeyAttribute.cs │ │ └── RedisKeyValueObject.cs │ ├── Linq │ │ ├── QueryEvaluator.cs │ │ ├── QueryProviderBase.cs │ │ ├── QueryableObject.cs │ │ ├── RedisQueryBuilder.cs │ │ └── RedisQueryProvider.cs │ └── UniSpy.LinqToRedis.csproj │ └── test │ ├── LinqToRedisTest.cs │ ├── NatNeg │ ├── RedisClient.cs │ └── UserInfo.cs │ └── UniSpy.LinqToRedis.Test.csproj ├── Servers ├── Chat │ ├── src │ │ ├── Abstraction │ │ │ ├── BaseClass │ │ │ │ ├── Channel │ │ │ │ │ ├── ChannelHandlerBase.cs │ │ │ │ │ ├── ChannelRequestBase.cs │ │ │ │ │ └── ChannelResponseBase.cs │ │ │ │ ├── CmdHandlerBase.cs │ │ │ │ ├── General │ │ │ │ │ └── LogedInHandlerBase.cs │ │ │ │ ├── Message │ │ │ │ │ ├── MessageHandlerBase.cs │ │ │ │ │ ├── MessageRequestBase.cs │ │ │ │ │ └── MessageResultBase.cs │ │ │ │ ├── RequestBase.cs │ │ │ │ ├── ResponseBase.cs │ │ │ │ └── ResultBase.cs │ │ │ └── Interface │ │ │ │ ├── IChannel.cs │ │ │ │ ├── IChatClient.cs │ │ │ │ └── IStorageOperation.cs │ │ ├── Aggregate │ │ │ ├── ChannelManager.cs │ │ │ ├── ChannelMode.cs │ │ │ ├── ChannelProperty │ │ │ │ ├── ChannelGeneral.cs │ │ │ │ ├── ChannelModeRelated.cs │ │ │ │ ├── ChannelOperation.cs │ │ │ │ ├── ChannelUserRelated.cs │ │ │ │ └── ChannelValidation.cs │ │ │ ├── ChannelUser.cs │ │ │ ├── KeyValueManager.cs │ │ │ ├── Misc │ │ │ │ ├── BufferCache.cs │ │ │ │ ├── ChatConstants.cs │ │ │ │ ├── ChatCrypt.cs │ │ │ │ ├── IRCErrorCode.cs │ │ │ │ ├── IRCReplyBuilder.cs │ │ │ │ ├── PeerChatCTX.cs │ │ │ │ └── ResponseName.cs │ │ │ ├── Redis │ │ │ │ ├── Contract │ │ │ │ │ ├── ChannelMessage.cs │ │ │ │ │ └── DisconnectRequest.cs │ │ │ │ └── RedisChannel.cs │ │ │ └── RemoteObjects.cs │ │ ├── Application │ │ │ ├── Client.cs │ │ │ ├── ClientInfo.cs │ │ │ ├── ClientManager.cs │ │ │ ├── Program.cs │ │ │ ├── Server.cs │ │ │ ├── ServerLauncher.cs │ │ │ └── StorageOperation.cs │ │ ├── Contract │ │ │ ├── Request │ │ │ │ ├── Channel │ │ │ │ │ ├── GetCKeyRequest.cs │ │ │ │ │ ├── GetChannelKeyRequest.cs │ │ │ │ │ ├── JoinRequest.cs │ │ │ │ │ ├── KickRequest.cs │ │ │ │ │ ├── ModeRequest.cs │ │ │ │ │ ├── PartRequest.cs │ │ │ │ │ ├── SetCKeyRequest.cs │ │ │ │ │ ├── SetChannelKeyRequest.cs │ │ │ │ │ └── TopicRequest.cs │ │ │ │ ├── General │ │ │ │ │ ├── CdKeyRequest.cs │ │ │ │ │ ├── CryptRequest.cs │ │ │ │ │ ├── GetKeyRequest.cs │ │ │ │ │ ├── GetUdpRelayRequest.cs │ │ │ │ │ ├── InviteRequest.cs │ │ │ │ │ ├── ListLimitRequest.cs │ │ │ │ │ ├── ListRequest.cs │ │ │ │ │ ├── LoginPreAuthRequest.cs │ │ │ │ │ ├── LoginRequest.cs │ │ │ │ │ ├── NamesRequest.cs │ │ │ │ │ ├── NickRequest.cs │ │ │ │ │ ├── PingRequest.cs │ │ │ │ │ ├── PongRequest.cs │ │ │ │ │ ├── QuitRequest.cs │ │ │ │ │ ├── RegisterNickRequest.cs │ │ │ │ │ ├── SetGroupRequest.cs │ │ │ │ │ ├── SetKeyRequest.cs │ │ │ │ │ ├── UserIPRequest.cs │ │ │ │ │ ├── UserRequest.cs │ │ │ │ │ ├── WhoIsRequest.cs │ │ │ │ │ └── WhoRequest.cs │ │ │ │ └── Message │ │ │ │ │ ├── AtmRequest.cs │ │ │ │ │ ├── NoticeRequest.cs │ │ │ │ │ ├── PrivateRequest.cs │ │ │ │ │ └── UtmRequest.cs │ │ │ ├── Response │ │ │ │ ├── Channel │ │ │ │ │ ├── GetCKeyResponse.cs │ │ │ │ │ ├── GetChannelKeyResponse.cs │ │ │ │ │ ├── JoinResponse.cs │ │ │ │ │ ├── KickResponse.cs │ │ │ │ │ ├── ModeResponse.cs │ │ │ │ │ ├── NamesResponse.cs │ │ │ │ │ ├── PartResponse.cs │ │ │ │ │ ├── SetCKeyResponse.cs │ │ │ │ │ ├── SetChannelKeyResponse.cs │ │ │ │ │ └── TopicResponse.cs │ │ │ │ ├── General │ │ │ │ │ ├── CdKeyResponse.cs │ │ │ │ │ ├── CryptResponse.cs │ │ │ │ │ ├── GetKeyResponse.cs │ │ │ │ │ ├── ListResponse.cs │ │ │ │ │ ├── LoginResponse.cs │ │ │ │ │ ├── NickResponse.cs │ │ │ │ │ ├── PingResponse.cs │ │ │ │ │ ├── UserIPResponse.cs │ │ │ │ │ ├── WhoIsResponse.cs │ │ │ │ │ └── WhoResponse.cs │ │ │ │ └── Message │ │ │ │ │ ├── AtmResponse.cs │ │ │ │ │ ├── NoticeResponse.cs │ │ │ │ │ ├── PrivateResponse.cs │ │ │ │ │ └── UtmResponse.cs │ │ │ └── Result │ │ │ │ ├── Channel │ │ │ │ ├── GetCKeyResult.cs │ │ │ │ ├── GetChannelKeyResult.cs │ │ │ │ ├── JoinResult.cs │ │ │ │ ├── KickResult.cs │ │ │ │ ├── ModeResult.cs │ │ │ │ ├── NamesResult.cs │ │ │ │ ├── PartResult.cs │ │ │ │ ├── SetChannelKeyResult.cs │ │ │ │ └── TopicResult.cs │ │ │ │ ├── General │ │ │ │ ├── CryptResult.cs │ │ │ │ ├── GetKeyResult.cs │ │ │ │ ├── ListResult.cs │ │ │ │ ├── LoginResult.cs │ │ │ │ ├── PingResult.cs │ │ │ │ ├── QuitResult.cs │ │ │ │ ├── UserIPResult.cs │ │ │ │ ├── WhoIsResult.cs │ │ │ │ └── WhoResult.cs │ │ │ │ └── Message │ │ │ │ ├── AtmResult.cs │ │ │ │ ├── NoticeResult.cs │ │ │ │ ├── PrivateResult.cs │ │ │ │ └── UtmResult.cs │ │ ├── Dockerfile │ │ ├── Enumerate │ │ │ ├── ChatChannelMode.cs │ │ │ ├── ChatMode.cs │ │ │ ├── Request │ │ │ │ ├── ChatRequest.cs │ │ │ │ └── ChatServerMessage.cs │ │ │ └── Response │ │ │ │ └── ChatErrorCode.cs │ │ ├── Exception │ │ │ ├── Exception.cs │ │ │ ├── IRC │ │ │ │ ├── Channel │ │ │ │ │ ├── BadChanMaskException.cs │ │ │ │ │ ├── BadChannelKeyException.cs │ │ │ │ │ ├── BannedFromChanException.cs │ │ │ │ │ ├── ChannelIsFullException.cs │ │ │ │ │ ├── InviteOnlyChanException.cs │ │ │ │ │ └── NoSuchChannelException.cs │ │ │ │ └── General │ │ │ │ │ ├── ErrOneUSNickNameException.cs │ │ │ │ │ ├── LoginFailedException.cs │ │ │ │ │ ├── MoreParametersException.cs │ │ │ │ │ ├── NickNameInUseException.cs │ │ │ │ │ ├── NoSuchNickException.cs │ │ │ │ │ ├── NoUniqueNickException.cs │ │ │ │ │ ├── RegisterNickFaildException.cs │ │ │ │ │ ├── TooManyChannels.cs │ │ │ │ │ └── UniqueNickExpiredException.cs │ │ │ ├── IRCChannelException.cs │ │ │ └── IRCException.cs │ │ ├── Handler │ │ │ ├── CmdHandler │ │ │ │ ├── Channel │ │ │ │ │ ├── GetCKeyHandler.cs │ │ │ │ │ ├── GetChannelKeyHandler.cs │ │ │ │ │ ├── JoinHandler.cs │ │ │ │ │ ├── KickHandler.cs │ │ │ │ │ ├── ModeHandler.cs │ │ │ │ │ ├── NamesHandler.cs │ │ │ │ │ ├── PartHandler.cs │ │ │ │ │ ├── SetCKeyHandler.cs │ │ │ │ │ ├── SetChannelKeyHandler.cs │ │ │ │ │ └── TopicHandler.cs │ │ │ │ ├── General │ │ │ │ │ ├── CdKeyHandler.cs │ │ │ │ │ ├── CryptHandler.cs │ │ │ │ │ ├── GetKeyHandler.cs │ │ │ │ │ ├── GetUdpRelayHandler.cs │ │ │ │ │ ├── InviteHandler.cs │ │ │ │ │ ├── ListHandler.cs │ │ │ │ │ ├── LoginHandler.cs │ │ │ │ │ ├── NickHandler.cs │ │ │ │ │ ├── PingHandler.cs │ │ │ │ │ ├── QuitHandler.cs │ │ │ │ │ ├── SetKeyHandler.cs │ │ │ │ │ ├── UserHandler.cs │ │ │ │ │ ├── UserIPHandler.cs │ │ │ │ │ ├── WhoHandler.cs │ │ │ │ │ └── WhoIsHandler.cs │ │ │ │ └── Message │ │ │ │ │ ├── AtmHandler.cs │ │ │ │ │ ├── NoticeHandler.cs │ │ │ │ │ ├── PrivateHandler.cs │ │ │ │ │ └── UtmHandler.cs │ │ │ └── CmdSwitcher.cs │ │ └── UniSpy.Server.Chat.csproj │ └── test │ │ ├── Channel │ │ ├── ChannelHandlerTest.cs │ │ ├── ChannelRequestTest.cs │ │ └── ChannelRequests.cs │ │ ├── Game │ │ └── GameTest.cs │ │ ├── General │ │ ├── GeneralRequestTest.cs │ │ └── GeneralRequests.cs │ │ ├── Message │ │ ├── MessageRequestTest.cs │ │ └── MessageRequests.cs │ │ ├── MockObject.cs │ │ ├── RedisChatChannelTest.cs │ │ └── UniSpy.Server.Chat.Test.csproj ├── GameStatus │ ├── src │ │ ├── Abstraction │ │ │ ├── BaseClass │ │ │ │ ├── CmdHandlerBase.cs │ │ │ │ ├── RequestBase.cs │ │ │ │ ├── ResponseBase.cs │ │ │ │ └── ResultBase.cs │ │ │ └── Interface │ │ │ │ └── IStorageOperation.cs │ │ ├── Aggregate │ │ │ └── Misc │ │ │ │ └── GSCrypt.cs │ │ ├── Application │ │ │ ├── Client.cs │ │ │ ├── ClientInfo.cs │ │ │ ├── Program.cs │ │ │ ├── Server.cs │ │ │ ├── ServerLauncher.cs │ │ │ └── StorageOperation.cs │ │ ├── Contract │ │ │ ├── Request │ │ │ │ ├── AuthGameRequest.cs │ │ │ │ ├── AuthPlayerRequest.cs │ │ │ │ ├── GetPlayerDataRequest.cs │ │ │ │ ├── GetProfileIDRequest.cs │ │ │ │ ├── NewGameRequest.cs │ │ │ │ ├── SetPlayerDataRequest.cs │ │ │ │ └── UpdateGameRequest.cs │ │ │ ├── Response │ │ │ │ ├── AuthGameResponse.cs │ │ │ │ ├── AuthPlayerResponse.cs │ │ │ │ ├── GetPlayerDataResponse.cs │ │ │ │ ├── GetProfileIDResponse.cs │ │ │ │ └── SetPlayerDataResponse.cs │ │ │ └── Result │ │ │ │ ├── AuthGameResult.cs │ │ │ │ ├── AuthPlayerResult.cs │ │ │ │ ├── GetPlayerDataResult.cs │ │ │ │ ├── GetProfileIDResult.cs │ │ │ │ └── SetPlayerDataResult.cs │ │ ├── Dockerfile │ │ ├── Enumerate │ │ │ ├── AuthMethod.cs │ │ │ ├── GSErrorCode.cs │ │ │ └── PersistantStorage.cs │ │ ├── Exception │ │ │ └── GSException.cs │ │ ├── Handler │ │ │ ├── CmdHandler │ │ │ │ ├── AuthGameHandler.cs │ │ │ │ ├── AuthPlayerHandler.cs │ │ │ │ ├── GetPlayerDataHandler.cs │ │ │ │ ├── GetProfileIDHandler.cs │ │ │ │ ├── NewGameHandler.cs │ │ │ │ ├── SetPlayerDataHandler.cs │ │ │ │ └── UpdateGameHandler.cs │ │ │ └── CmdSwitcher.cs │ │ └── UniSpy.Server.GameStatus.csproj │ └── test │ │ ├── GameTest.cs │ │ ├── MockObject.cs │ │ ├── RequestTest.cs │ │ └── UniSpy.Server.GameStatus.Test.csproj ├── GameTrafficRelay │ ├── src │ │ ├── Application │ │ │ ├── Program.cs │ │ │ ├── Server.cs │ │ │ ├── ServerLauncher.cs │ │ │ └── StorageOperation.cs │ │ ├── Contracts │ │ │ └── NatNegotiation.cs │ │ ├── Controllers │ │ │ └── NatNegotiationController.cs │ │ ├── Dockerfile │ │ ├── Entity │ │ │ ├── ConnectionForwardClient.cs │ │ │ ├── ConnectionListener.cs │ │ │ ├── ConnectionPairs.cs │ │ │ ├── NetworkUtils.cs │ │ │ ├── RelayServerInfo.cs │ │ │ └── ServerStatusReporter.cs │ │ ├── Interface │ │ │ ├── IConnectionForwardClient.cs │ │ │ ├── IConnectionListener.cs │ │ │ └── IStorageOperation.cs │ │ ├── UniSpy.Server.GameTrafficRelay.csproj │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ └── test │ │ ├── GameTest.cs │ │ ├── TestClasses.cs │ │ └── UniSpy.Server.GameTrafficRelay.Test.csproj ├── NatNegotiation │ ├── src │ │ ├── Abstraction │ │ │ ├── BaseClass │ │ │ │ ├── CmdHandlerBase.cs │ │ │ │ ├── CommonRequestBase.cs │ │ │ │ ├── CommonResponseBase.cs │ │ │ │ ├── CommonResultBase.cs │ │ │ │ ├── RequestBase.cs │ │ │ │ ├── ResponseBase.cs │ │ │ │ └── ResultBase.cs │ │ │ └── Interface │ │ │ │ └── IStorageOperation.cs │ │ ├── Aggregate │ │ │ ├── Misc │ │ │ │ ├── NatProperty.cs │ │ │ │ └── NatReportInfo.cs │ │ │ └── Redis │ │ │ │ ├── NatAddressInfo.cs │ │ │ │ └── NatFailInfo.cs │ │ ├── Application │ │ │ ├── Client.cs │ │ │ ├── ClientInfo.cs │ │ │ ├── Program.cs │ │ │ ├── Server.cs │ │ │ ├── ServerLauncher.cs │ │ │ └── StorageOperation.cs │ │ ├── Contract │ │ │ ├── Request │ │ │ │ ├── AddressCheckRequest.cs │ │ │ │ ├── ConnectAckRequest.cs │ │ │ │ ├── ConnectRequest.cs │ │ │ │ ├── ErtAckRequest.cs │ │ │ │ ├── InitRequest.cs │ │ │ │ ├── NatifyRequest.cs │ │ │ │ ├── PingRequest.cs │ │ │ │ ├── PreInitRequest.cs │ │ │ │ └── ReportRequest.cs │ │ │ ├── Response │ │ │ │ ├── ConnectResponse.cs │ │ │ │ ├── InitResponse.cs │ │ │ │ ├── PreInitResponse.cs │ │ │ │ └── ReportResponse.cs │ │ │ └── Result │ │ │ │ ├── AddressCheckResult.cs │ │ │ │ ├── ConnectResult.cs │ │ │ │ ├── ErtAckResult.cs │ │ │ │ ├── InitResult.cs │ │ │ │ ├── NatifyResult.cs │ │ │ │ ├── PreInitResult.cs │ │ │ │ └── ReportResult.cs │ │ ├── Dockerfile │ │ ├── Enumerate │ │ │ ├── ConnectPacketStatus.cs │ │ │ ├── NatMappingType.cs │ │ │ ├── NatNegResult.cs │ │ │ ├── NatPacketType.cs │ │ │ ├── NatPortType.cs │ │ │ ├── NatPunchStrategy.cs │ │ │ ├── NatStrategyType.cs │ │ │ └── NatifyPacketType.cs │ │ ├── Exception │ │ │ └── NNException.cs │ │ ├── Handler │ │ │ ├── CmdHandler │ │ │ │ ├── AddressCheckHandler.cs │ │ │ │ ├── ConnectAckHandler.cs │ │ │ │ ├── ConnectHandler.cs │ │ │ │ ├── ErtAckHandler.cs │ │ │ │ ├── InitHandler.cs │ │ │ │ ├── NatifyHandler.cs │ │ │ │ └── ReportHandler.cs │ │ │ └── CmdSwitcher.cs │ │ └── UniSpy.Server.NatNegotiation.csproj │ └── test │ │ ├── GameTest.cs │ │ ├── HandlerTest.cs │ │ ├── MockObject.cs │ │ ├── NatDetectionTest.cs │ │ ├── RequestTest.cs │ │ └── UniSpy.Server.NatNegotiation.Test.csproj ├── PresenceConnectionManager │ ├── src │ │ ├── Abstraction │ │ │ ├── BaseClass │ │ │ │ ├── CmdHandlerBase.cs │ │ │ │ ├── LoggedInCmdHandlerBase.cs │ │ │ │ ├── RequestBase.cs │ │ │ │ ├── ResponseBase.cs │ │ │ │ └── ResultBase.cs │ │ │ └── Interface │ │ │ │ └── IStorageOperation.cs │ │ ├── Aggregate │ │ │ ├── Misc │ │ │ │ ├── LoginChallengeProof.cs │ │ │ │ ├── SDKRevision.cs │ │ │ │ └── Status │ │ │ │ │ ├── UserStatus.cs │ │ │ │ │ └── UserStatusInfo.cs │ │ │ └── Redis │ │ │ │ ├── UserInfoRedisKey.cs │ │ │ │ └── UserInfoRedisOperator.cs │ │ ├── Application │ │ │ ├── Client.cs │ │ │ ├── ClientInfo.cs │ │ │ ├── ClientManager.cs │ │ │ ├── Program.cs │ │ │ ├── Server.cs │ │ │ ├── ServerLauncher.cs │ │ │ └── StorageOperation.cs │ │ ├── Contract │ │ │ ├── Request │ │ │ │ ├── Buddy │ │ │ │ │ ├── AddBuddyRequest.cs │ │ │ │ │ ├── DelBuddyRequest.cs │ │ │ │ │ ├── InviteToRequest.cs │ │ │ │ │ ├── StatusInfoRequest.cs │ │ │ │ │ └── StatusRequest.cs │ │ │ │ ├── General │ │ │ │ │ ├── KeepAliveRequest.cs │ │ │ │ │ ├── LoginRequest.cs │ │ │ │ │ └── LogoutRequest.cs │ │ │ │ └── Profile │ │ │ │ │ ├── AddBlockRequest.cs │ │ │ │ │ ├── GetProfileRequest.cs │ │ │ │ │ ├── NewProfileRequest.cs │ │ │ │ │ ├── RegisterCDKeyRequest.cs │ │ │ │ │ ├── RegisterNickRequest.cs │ │ │ │ │ ├── UpdateProfileRequest.cs │ │ │ │ │ └── UpdateUIRequest.cs │ │ │ ├── Response │ │ │ │ ├── Buddy │ │ │ │ │ ├── AddBuddyResponse.cs │ │ │ │ │ ├── BlockListResponse.cs │ │ │ │ │ ├── BuddyListResponse.cs │ │ │ │ │ └── StatusInfoResponse.cs │ │ │ │ ├── General │ │ │ │ │ ├── KeepAliveResponse.cs │ │ │ │ │ ├── LoginResponse.cs │ │ │ │ │ └── NewUserResponse.cs │ │ │ │ └── Profile │ │ │ │ │ ├── GetProfileResponse.cs │ │ │ │ │ ├── NewProfileResponse.cs │ │ │ │ │ ├── RegisterCDKeyResponse.cs │ │ │ │ │ └── RegisterNickResponse.cs │ │ │ └── Result │ │ │ │ ├── Buddy │ │ │ │ ├── AddBuddyResult.cs │ │ │ │ ├── BlockListResult.cs │ │ │ │ ├── BuddyListResult.cs │ │ │ │ ├── StatusInfoResult.cs │ │ │ │ └── StatusResult.cs │ │ │ │ ├── General │ │ │ │ └── LoginResult.cs │ │ │ │ ├── PCMDefaultResult.cs │ │ │ │ └── Profile │ │ │ │ ├── GetProfileResult.cs │ │ │ │ └── NewProfileResult.cs │ │ ├── Dockerfile │ │ ├── Enumerate │ │ │ ├── BuddyMessageType.cs │ │ │ ├── DisconnectReason.cs │ │ │ ├── FireWallType.cs │ │ │ ├── GPBasic.cs │ │ │ ├── GPStatusCode.cs │ │ │ ├── GenderType.cs │ │ │ ├── LoginStatus.cs │ │ │ ├── LoginType.cs │ │ │ ├── PublicMask.cs │ │ │ ├── QuietModeType.cs │ │ │ └── SDKRevisionType.cs │ │ ├── Handler │ │ │ ├── CmdHandler │ │ │ │ ├── Buddy │ │ │ │ │ ├── AddBuddyHandler.cs │ │ │ │ │ ├── BlockListHandler.cs │ │ │ │ │ ├── BuddyListHandler.cs │ │ │ │ │ ├── BuddyStatusInfoHandler.cs │ │ │ │ │ ├── DelBuddyHandler.cs │ │ │ │ │ ├── InviteToHandler.cs │ │ │ │ │ ├── StatusHandler.cs │ │ │ │ │ └── StatusInfoHandler.cs │ │ │ │ ├── General │ │ │ │ │ ├── KeepAliveHandler.cs │ │ │ │ │ ├── LoginHandler.cs │ │ │ │ │ ├── LogoutHandler.cs │ │ │ │ │ ├── NewUserHandler.cs │ │ │ │ │ └── SDKRevisionHandler.cs │ │ │ │ └── Profile │ │ │ │ │ ├── AddBlockHandler.cs │ │ │ │ │ ├── GetProfileHandler.cs │ │ │ │ │ ├── NewProfileHandler.cs │ │ │ │ │ ├── RegisterCDKeyHandler.cs │ │ │ │ │ ├── RegisterNickHandler.cs │ │ │ │ │ ├── RemoveBlockHandler.cs │ │ │ │ │ ├── UpdateProfileHandler.cs │ │ │ │ │ └── UpdateUserInfoHandler.cs │ │ │ └── CmdSwitcher.cs │ │ └── UniSpy.Server.PresenceConnectionManager.csproj │ └── test │ │ ├── Buddy │ │ ├── BuddyRequestTest.cs │ │ └── BuddyRequests.cs │ │ ├── Game │ │ └── GameTest.cs │ │ ├── General │ │ ├── GeneralRequestTest.cs │ │ └── GeneralRequests.cs │ │ ├── MokeObject.cs │ │ ├── Persist │ │ └── PersistTest.cs │ │ ├── Profile │ │ ├── ProfileRequestTest.cs │ │ └── ProfileRequests.cs │ │ └── UniSpy.Server.PresenceConnectionManager.Test.csproj ├── PresenceSearchPlayer │ ├── src │ │ ├── Abstraction │ │ │ ├── BaseClass │ │ │ │ ├── CmdHandlerBase.cs │ │ │ │ ├── RequestBase.cs │ │ │ │ ├── ResponseBase.cs │ │ │ │ └── ResultBase.cs │ │ │ └── Interface │ │ │ │ └── IStorageOperation.cs │ │ ├── Aggregate │ │ │ └── PSPRequestName.cs │ │ ├── Application │ │ │ ├── Client.cs │ │ │ ├── ClientInfo.cs │ │ │ ├── Program.cs │ │ │ ├── Server.cs │ │ │ ├── ServerLauncher.cs │ │ │ └── StorageOperation.cs │ │ ├── Contract │ │ │ ├── Request │ │ │ │ ├── CheckRequest.cs │ │ │ │ ├── NewUserRequest.cs │ │ │ │ ├── NicksRequest.cs │ │ │ │ ├── OthersListRequest.cs │ │ │ │ ├── OthersRequest.cs │ │ │ │ ├── SearchRequest.cs │ │ │ │ ├── SearchUniqueRequest.cs │ │ │ │ ├── UniqueSearchRequest.cs │ │ │ │ └── ValidRequest.cs │ │ │ ├── Response │ │ │ │ ├── CheckResponse.cs │ │ │ │ ├── NewUserResponse.cs │ │ │ │ ├── NicksResponse.cs │ │ │ │ ├── OthersListResponse.cs │ │ │ │ ├── OthersResponse.cs │ │ │ │ ├── SearchResponse.cs │ │ │ │ ├── SearchUniqueResponse.cs │ │ │ │ ├── UniqueSearchResponse.cs │ │ │ │ └── ValidResponse.cs │ │ │ └── Result │ │ │ │ ├── CheckResult.cs │ │ │ │ ├── NewUserResult.cs │ │ │ │ ├── NicksResult.cs │ │ │ │ ├── OthersListResult.cs │ │ │ │ ├── OthersResult.cs │ │ │ │ ├── PSPDefaultResult.cs │ │ │ │ ├── SearchResult.cs │ │ │ │ ├── SearchUniqueResult.cs │ │ │ │ ├── UniqueSearchResult.cs │ │ │ │ └── ValidResult.cs │ │ ├── Dockerfile │ │ ├── Enumerator │ │ │ ├── GPEnum.cs │ │ │ ├── GPErrorCode.cs │ │ │ └── NewUserStatus.cs │ │ ├── Exception │ │ │ ├── AddBuddy │ │ │ │ ├── GPAddBuddyAlreadyBuddyException.cs │ │ │ │ ├── GPAddBuddyBadFormException.cs │ │ │ │ ├── GPAddBuddyBadNewException.cs │ │ │ │ └── GPAddBuddyException.cs │ │ │ ├── AuthAdd │ │ │ │ ├── GPAuthAddBadFormException.cs │ │ │ │ ├── GPAuthAddBadSigExceptiion.cs │ │ │ │ └── GPAuthAddException.cs │ │ │ ├── BuddyMsg │ │ │ │ ├── GPBuddyMsgException.cs │ │ │ │ ├── GPBuddyMsgExtInfoNotSupportedException.cs │ │ │ │ └── GPBuddyMsgNotBuddyException.cs │ │ │ ├── Check │ │ │ │ └── CheckException.cs │ │ │ ├── General │ │ │ │ ├── GPBadSessionKeyException.cs │ │ │ │ ├── GPConnectionCloseException.cs │ │ │ │ ├── GPDatabaseException.cs │ │ │ │ ├── GPException.cs │ │ │ │ ├── GPForcedDisconnectException.cs │ │ │ │ ├── GPNetworkException.cs │ │ │ │ ├── GPNotLoggedInException.cs │ │ │ │ ├── GPParseException.cs │ │ │ │ └── GPUdpLayerException.cs │ │ │ ├── Login │ │ │ │ ├── GPLoginBadEmailException.cs │ │ │ │ ├── GPLoginBadLoginTicketException.cs │ │ │ │ ├── GPLoginBadNickException.cs │ │ │ │ ├── GPLoginBadPasswordException.cs │ │ │ │ ├── GPLoginBadPreAuthException.cs │ │ │ │ ├── GPLoginBadProfileException.cs │ │ │ │ ├── GPLoginBadUniquenickException.cs │ │ │ │ ├── GPLoginConnectionFailedException.cs │ │ │ │ ├── GPLoginException.cs │ │ │ │ ├── GPLoginProfileDeletedException.cs │ │ │ │ ├── GPLoginServerAuthFailedException.cs │ │ │ │ ├── GPLoginTicketExpiredException.cs │ │ │ │ └── GPLoginTimeOutException.cs │ │ │ ├── NewProfile │ │ │ │ ├── GPNewProfileBadNickException.cs │ │ │ │ ├── GPNewProfileBadOldNick.cs │ │ │ │ └── GPNewProfileException.cs │ │ │ ├── NewUser │ │ │ │ ├── GPNewUserBadNickException.cs │ │ │ │ ├── GPNewUserBadPasswordException.cs │ │ │ │ ├── GPNewUserException.cs │ │ │ │ ├── GPNewUserUniquenickInUseException.cs │ │ │ │ └── GPNewUserUniquenickInvalidException.cs │ │ │ ├── Status │ │ │ │ └── GPStatusException.cs │ │ │ ├── UpdatePro │ │ │ │ ├── GPUpdateProBadNickException.cs │ │ │ │ └── GPUpdateProException.cs │ │ │ └── UpdateUI │ │ │ │ ├── GPUpdateUIBadEmailException.cs │ │ │ │ └── GPUpdateUIException.cs │ │ ├── Handler │ │ │ ├── CmdHandler │ │ │ │ ├── CheckHandler.cs │ │ │ │ ├── NewUserHandler.cs │ │ │ │ ├── NicksHandler.cs │ │ │ │ ├── OthersHandler.cs │ │ │ │ ├── OthersListHandler.cs │ │ │ │ ├── PmatchHandler.cs │ │ │ │ ├── SearchHandler.cs │ │ │ │ ├── SearchUniqueHandler.cs │ │ │ │ ├── UniqueSearchHandler.cs │ │ │ │ └── ValidHandler.cs │ │ │ └── CmdSwitcher.cs │ │ └── UniSpy.Server.PresenceSearchPlayer.csproj │ └── test │ │ ├── GameTest.cs │ │ ├── MokeObject.cs │ │ ├── RawRequests.cs │ │ ├── RequestTests.cs │ │ └── UniSpy.Server.PresenceSearchPlayer.Test.csproj ├── QueryReport │ ├── src │ │ ├── Aggregate │ │ │ └── Redis │ │ │ │ └── PeerRoomInfo.cs │ │ ├── Application │ │ │ ├── Client.cs │ │ │ ├── ClientInfo.cs │ │ │ ├── Program.cs │ │ │ ├── Server.cs │ │ │ ├── ServerLauncher.cs │ │ │ └── StorageOperation.cs │ │ ├── Dockerfile │ │ ├── Exception │ │ │ └── Exception.cs │ │ ├── UniSpy.Server.QueryReport.csproj │ │ ├── V1 │ │ │ ├── Abstraction │ │ │ │ ├── BaseClass │ │ │ │ │ ├── CmdHandlerBase.cs │ │ │ │ │ ├── RequestBase.cs │ │ │ │ │ ├── ResponseBase.cs │ │ │ │ │ └── ResultBase.cs │ │ │ │ └── Interface │ │ │ │ │ └── IStorageOperation.cs │ │ │ ├── Aggregation │ │ │ │ ├── Enctype0.cs │ │ │ │ └── Redis │ │ │ │ │ └── GameServerInfo.cs │ │ │ ├── Application │ │ │ │ └── StorageOperation.cs │ │ │ ├── Contract │ │ │ │ ├── Request │ │ │ │ │ ├── EchoRequest.cs │ │ │ │ │ ├── HeartbeatRequest.cs │ │ │ │ │ └── ValidateRequest.cs │ │ │ │ └── Response │ │ │ │ │ ├── EchoResponse.cs │ │ │ │ │ └── HeartbeatResponse.cs │ │ │ └── Handler │ │ │ │ ├── CmdHandler │ │ │ │ ├── EchoHandler.cs │ │ │ │ ├── HeartbeatHandler.cs │ │ │ │ └── ValidateHandler.cs │ │ │ │ └── CmdSwitcher.cs │ │ └── V2 │ │ │ ├── Abstraction │ │ │ ├── BaseClass │ │ │ │ ├── CmdHandlerBase.cs │ │ │ │ ├── RequestBase.cs │ │ │ │ ├── ResponseBase.cs │ │ │ │ └── ResultBase.cs │ │ │ └── Interface │ │ │ │ └── IStorageOperation.cs │ │ │ ├── Aggregate │ │ │ ├── Misc │ │ │ │ ├── Encryption.cs │ │ │ │ ├── NatNegCookie.cs │ │ │ │ └── RegionID.cs │ │ │ └── Redis │ │ │ │ ├── ChannelInfo.cs │ │ │ │ ├── GameServerInfo.cs │ │ │ │ ├── HeartBeatChannel.cs │ │ │ │ └── NatNegChannel.cs │ │ │ ├── Application │ │ │ └── StorageOperation.cs │ │ │ ├── Contract │ │ │ ├── Request │ │ │ │ ├── AvaliableRequest.cs │ │ │ │ ├── ChallengeRequest.cs │ │ │ │ ├── ClientMessageAckRequest.cs │ │ │ │ ├── ClientMessageRequest.cs │ │ │ │ ├── EchoRequest.cs │ │ │ │ ├── HeartBeatRequest.cs │ │ │ │ └── KeepAliveRequest.cs │ │ │ ├── Response │ │ │ │ ├── AvaliableResponse.cs │ │ │ │ ├── ChallengeResponse.cs │ │ │ │ ├── ClientMessageResponse.cs │ │ │ │ ├── HeartBeatResponse.cs │ │ │ │ └── KeepAliveResponse.cs │ │ │ └── Result │ │ │ │ ├── ChallengeResult.cs │ │ │ │ ├── ClientMessageResult.cs │ │ │ │ ├── EchoResult.cs │ │ │ │ └── HeartBeatResult.cs │ │ │ ├── Enumerate │ │ │ ├── GeneralEnum.cs │ │ │ ├── HeartBeatEnum.cs │ │ │ └── ServerAvailability.cs │ │ │ └── Handler │ │ │ ├── CmdHandler │ │ │ ├── AvailableHandler.cs │ │ │ ├── ChallengeHandler.cs │ │ │ ├── ClientMessageAckHandler.cs │ │ │ ├── ClientMessageHandler.cs │ │ │ ├── EchoHandler.cs │ │ │ ├── HeartBeatHandler.cs │ │ │ └── KeepAliveHandler.cs │ │ │ └── CmdSwitcher.cs │ └── test │ │ ├── UniSpy.Server.QueryReport.Test.csproj │ │ └── V2 │ │ ├── GameTest.cs │ │ ├── MockObject.cs │ │ └── RequestTest.cs ├── ServerBrowser │ ├── src │ │ ├── Aggregate │ │ │ └── GameServerFilter.cs │ │ ├── Application │ │ │ ├── Program.cs │ │ │ └── ServerLauncher.cs │ │ ├── Dockerfile │ │ ├── Exception │ │ │ └── Exception.cs │ │ ├── UniSpy.Server.ServerBrowser.csproj │ │ ├── V1 │ │ │ ├── Abstraction │ │ │ │ ├── BaseClass │ │ │ │ │ ├── CmdHandlerBase.cs │ │ │ │ │ ├── EnctypeBase.cs │ │ │ │ │ ├── RequestBase.cs │ │ │ │ │ ├── ResponseBase.cs │ │ │ │ │ └── ResultBase.cs │ │ │ │ └── Interface │ │ │ │ │ └── IStorageOperation.cs │ │ │ ├── Aggregate │ │ │ │ ├── Enctype1.cs │ │ │ │ └── Enctype2.cs │ │ │ ├── Application │ │ │ │ ├── Client.cs │ │ │ │ ├── ClientInfo.cs │ │ │ │ └── Server.cs │ │ │ ├── Contract │ │ │ │ ├── Request │ │ │ │ │ ├── GameNameRequest.cs │ │ │ │ │ └── ListRequest.cs │ │ │ │ ├── Response │ │ │ │ │ ├── GameNameResponse.cs │ │ │ │ │ └── ListResponse.cs │ │ │ │ └── Result │ │ │ │ │ └── ListResult.cs │ │ │ └── Handler │ │ │ │ ├── CmdHandler │ │ │ │ ├── GameNameHandler.cs │ │ │ │ └── ListHandler.cs │ │ │ │ └── CmdSwitcher.cs │ │ └── V2 │ │ │ ├── Abstraction │ │ │ └── BaseClass │ │ │ │ ├── AdHocRequestBase.cs │ │ │ │ ├── AdHocResponseBase.cs │ │ │ │ ├── CmdHandlerBase.cs │ │ │ │ ├── RequestBase.cs │ │ │ │ ├── ResponseBase.cs │ │ │ │ ├── ResultBase.cs │ │ │ │ └── ServerListUpdateOption │ │ │ │ ├── ServerListUpdateOptionHandlerBase.cs │ │ │ │ ├── ServerListUpdateOptionRequestBase.cs │ │ │ │ ├── ServerListUpdateOptionResponseBase.cs │ │ │ │ └── ServerListUpdateOptionResultBase.cs │ │ │ ├── Aggregate │ │ │ ├── HeartbeatChannel.cs │ │ │ ├── Misc │ │ │ │ ├── BufferCache.cs │ │ │ │ ├── Encryption.cs │ │ │ │ ├── GameFilter.cs │ │ │ │ ├── KeyType.cs │ │ │ │ └── SBStringFlag.cs │ │ │ └── ServerInfoBuilder.cs │ │ │ ├── Application │ │ │ ├── Client.cs │ │ │ ├── ClientInfo.cs │ │ │ ├── ClientManager.cs │ │ │ └── Server.cs │ │ │ ├── Contract │ │ │ ├── Request │ │ │ │ ├── AdHoc │ │ │ │ │ ├── PlayerSearchRequest.cs │ │ │ │ │ ├── SendMsgRequest.cs │ │ │ │ │ └── ServerInfoRequest.cs │ │ │ │ └── ServerList │ │ │ │ │ └── ServerListRequest.cs │ │ │ ├── Response │ │ │ │ ├── AdHoc │ │ │ │ │ ├── DeleteServerInfoResponse.cs │ │ │ │ │ └── UpdateServerInfoResponse.cs │ │ │ │ └── ServerList │ │ │ │ │ ├── P2PGroupRoomListResponse.cs │ │ │ │ │ ├── ServerMainListResponse.cs │ │ │ │ │ └── ServerNetworkInfoListResponse.cs │ │ │ └── Result │ │ │ │ ├── AdHoc │ │ │ │ └── AdHocResult.cs │ │ │ │ └── ServerList │ │ │ │ ├── P2PGroupRoomListResult.cs │ │ │ │ ├── ServerMainListResult.cs │ │ │ │ └── ServerNetworkInfoListResult.cs │ │ │ ├── Enumerate │ │ │ ├── GeneralEnum.cs │ │ │ └── ServerListEnum.cs │ │ │ └── Handler │ │ │ ├── CmdHandler │ │ │ ├── AdHoc │ │ │ │ ├── AdHocHandler.cs │ │ │ │ ├── SendMsgHandler.cs │ │ │ │ └── ServerInfoHandler.cs │ │ │ └── ServerList │ │ │ │ └── ServerListHandler.cs │ │ │ └── CmdSwitcher.cs │ └── test │ │ ├── UniSpy.Server.ServerBrowser.Test.csproj │ │ ├── V1 │ │ └── RequestTest.cs │ │ └── V2 │ │ ├── FilterTest.cs │ │ ├── GameTest.cs │ │ ├── MockObject.cs │ │ ├── PeerRoomTest.cs │ │ └── RequestTest.cs └── WebServer │ ├── src │ ├── Abstraction │ │ ├── CmdHandlerBase.cs │ │ ├── RequestBase.cs │ │ ├── ResponseBase.cs │ │ ├── ResultBase.cs │ │ └── SoapEnvelopBase.cs │ ├── Application │ │ ├── Client.cs │ │ ├── ClientInfo.cs │ │ ├── Program.cs │ │ ├── Server.cs │ │ └── ServerLauncher.cs │ ├── Dockerfile │ ├── Entity │ │ ├── Constant │ │ │ └── WebEndpoints.cs │ │ └── Structure │ │ │ ├── SakeArrayObject.cs │ │ │ └── SoapXElement.cs │ ├── Handler │ │ └── CmdSwitcher.cs │ ├── Module │ │ ├── Atlas │ │ │ └── Contract │ │ │ │ └── Request │ │ │ │ ├── CreateMatchlessSessionRequest.cs │ │ │ │ ├── CreateSessionRequest.cs │ │ │ │ ├── SetReportIntentionRequest.cs │ │ │ │ └── SubmitReportRequest.cs │ │ ├── Auth │ │ │ ├── Abstraction │ │ │ │ ├── LoginRequestBase.cs │ │ │ │ ├── LoginResponseBase.cs │ │ │ │ ├── LoginResultBase.cs │ │ │ │ └── ResponseBase.cs │ │ │ ├── Contract │ │ │ │ ├── AuthSoapEnvelope.cs │ │ │ │ ├── Request │ │ │ │ │ ├── LoginProfileRequest.cs │ │ │ │ │ ├── LoginProfileWithGameIdRequest.cs │ │ │ │ │ ├── LoginPs3CertRequest.cs │ │ │ │ │ ├── LoginPs3CertWithGameIdRequest.cs │ │ │ │ │ ├── LoginRemoteAuthRequest.cs │ │ │ │ │ ├── LoginRemoteAuthWithGameIdRequest.cs │ │ │ │ │ ├── LoginUniqueNickRequest.cs │ │ │ │ │ └── LoginUniqueNickWithGameId.cs │ │ │ │ ├── Response │ │ │ │ │ ├── LoginProfileResponse.cs │ │ │ │ │ ├── LoginProfileWithGameIdResponse.cs │ │ │ │ │ ├── LoginPs3CertResponse.cs │ │ │ │ │ ├── LoginPs3CertWithGameIdResponse.cs │ │ │ │ │ ├── LoginRemoteAuthResponse.cs │ │ │ │ │ ├── LoginRemoteAuthWithGameIdResponse.cs │ │ │ │ │ ├── LoginUniqueNickResponse.cs │ │ │ │ │ └── LoginUniqueNickWithGameIdResponse.cs │ │ │ │ └── Result │ │ │ │ │ ├── LoginProfileResult.cs │ │ │ │ │ ├── LoginPs3CertResult.cs │ │ │ │ │ ├── LoginRemoteAuthResult.cs │ │ │ │ │ └── LoginUniqueNickResult.cs │ │ │ ├── Exception │ │ │ │ ├── DatabaseException.cs │ │ │ │ ├── Exception.cs │ │ │ │ ├── InvalidPasswordException.cs │ │ │ │ ├── InvalidProfileException.cs │ │ │ │ ├── ParseException.cs │ │ │ │ ├── ServerException.cs │ │ │ │ ├── ServerInitException.cs │ │ │ │ ├── UniqueNickExpredException.cs │ │ │ │ └── UserNotFoundException.cs │ │ │ └── Handler │ │ │ │ ├── LoginProfileHandler.cs │ │ │ │ ├── LoginProfileWithGameIdHandler.cs │ │ │ │ ├── LoginPs3CertHandler.cs │ │ │ │ ├── LoginPs3CertWithGameIdHandler.cs │ │ │ │ ├── LoginRemoteAuthHandler.cs │ │ │ │ ├── LoginRemoteAuthWithGameIdHandler.cs │ │ │ │ ├── LoginUniqueNickHandler.cs │ │ │ │ └── LoginUniqueNickWithGameIdHandler.cs │ │ ├── Direct2Game │ │ │ ├── Abstraction │ │ │ │ ├── RequestBase.cs │ │ │ │ ├── ResponseBase.cs │ │ │ │ └── ResultBase.cs │ │ │ ├── Contract │ │ │ │ ├── Direct2GameSoapEnvelope.cs │ │ │ │ ├── Request │ │ │ │ │ ├── GetPurchaseHistoryRequest.cs │ │ │ │ │ └── GetStoreAvailabilityRequest.cs │ │ │ │ ├── Response │ │ │ │ │ ├── GetPurchaseHistoryResponse.cs │ │ │ │ │ └── GetStoreAvailabilityResponse.cs │ │ │ │ └── Result │ │ │ │ │ ├── GetPurchaseHistoryResult.cs │ │ │ │ │ └── GetStoreAvailabilityResult.cs │ │ │ └── Handler │ │ │ │ ├── GetPurchaseHistoryHandler.cs │ │ │ │ └── GetStoreAvailabilityHandler.cs │ │ ├── IngameAd │ │ │ └── Contract │ │ │ │ └── Request │ │ │ │ ├── GetTargettedAdRequest.cs │ │ │ │ └── ReportAdUsageRequest.cs │ │ ├── PatchingAndTracking │ │ │ └── Contract │ │ │ │ └── Request │ │ │ │ ├── MotdRequest.cs │ │ │ │ └── VercheckRequest.cs │ │ ├── Racing │ │ │ └── Contract │ │ │ │ └── Request │ │ │ │ ├── GetContestDataRequest.cs │ │ │ │ ├── GetFriendRankingsRequest.cs │ │ │ │ ├── GetRegionalDataRequest.cs │ │ │ │ ├── GetTenAboveRankingsRequest.cs │ │ │ │ ├── GetTopTenRankingsRequest.cs │ │ │ │ ├── SubmitGhostRequest.cs │ │ │ │ └── SubmitScoresRequest.cs │ │ └── Sake │ │ │ ├── Abstraction │ │ │ ├── CmdHandlerBase.cs │ │ │ ├── RequestBase.cs │ │ │ ├── ResponseBase.cs │ │ │ └── ResultBase.cs │ │ │ ├── Contract │ │ │ ├── Request │ │ │ │ ├── CreateRecordRequest.cs │ │ │ │ ├── DeleteRecordRequest.cs │ │ │ │ ├── GetMyRecordsRequest.cs │ │ │ │ ├── GetRandomRecordsRequest.cs │ │ │ │ ├── GetRecordLimitRequest.cs │ │ │ │ ├── GetSpecificRecordsRequest.cs │ │ │ │ ├── RateRecordRequest.cs │ │ │ │ ├── SearchForRecordsRequest.cs │ │ │ │ └── UpdateRecordRequest.cs │ │ │ ├── Response │ │ │ │ ├── CreateRecordResponse.cs │ │ │ │ ├── GetMyRecordResponse.cs │ │ │ │ └── SearchForRecordResponse.cs │ │ │ ├── Result │ │ │ │ ├── CreateRecordResult.cs │ │ │ │ └── GetMyRecordsResult.cs │ │ │ └── SakeSoapEnvelope.cs │ │ │ └── Handler │ │ │ ├── CreateRecordHandler.cs │ │ │ ├── GetMyRecordsHandler.cs │ │ │ └── SearchForRecordsHandler.cs │ ├── UniSpy.Server.WebServer.csproj │ └── UniSpy_Logo.ico │ └── test │ ├── Atlas │ ├── RawRequests.cs │ └── RequestsTest.cs │ ├── Auth │ ├── HandlerTest.cs │ ├── RawRequests.cs │ └── RequestsTest.cs │ ├── Racing │ ├── RawRequests.cs │ └── RequestsTest.cs │ ├── Sake │ ├── HandlerTest.cs │ ├── RawRequests.cs │ ├── RequestsTest.cs │ └── ResponseTest.cs │ ├── TestClasses.cs │ └── UniSpy.Server.WebServer.Test.csproj └── test ├── Anno1701.cs ├── TestClasses.cs └── UniSpy.Server.Test.csproj /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG VARIANT="6.0-bullseye-slim" 2 | FROM mcr.microsoft.com/vscode/devcontainers/dotnet:0-${VARIANT} -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "C# (.NET)", 3 | "build": { 4 | "dockerfile": "Dockerfile", 5 | "args": { 6 | "VARIANT": "6.0" 7 | } 8 | }, 9 | "settings": {}, 10 | "extensions": [ 11 | "ms-dotnettools.csharp" 12 | ], 13 | "appPort": [ 14 | 29910, 15 | 6667, 16 | 29920, 17 | 10086, 18 | 27901, 19 | 29900, 20 | 29901, 21 | 27900, 22 | 28910, 23 | 28900, 24 | 80 25 | ], 26 | "remoteUser": "vscode" 27 | } -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | **/.classpath 2 | **/.dockerignore 3 | **/.env 4 | **/.git 5 | **/.gitignore 6 | **/.project 7 | **/.settings 8 | **/.toolstarget 9 | **/.vs 10 | **/.vscode 11 | **/*.*proj.user 12 | **/*.dbmdl 13 | **/*.jfm 14 | **/azds.yaml 15 | **/bin 16 | **/charts 17 | **/docker-compose* 18 | **/Dockerfile* 19 | **/node_modules 20 | **/npm-debug.log 21 | **/obj 22 | **/secrets.dev.yaml 23 | **/values.dev.yaml 24 | LICENSE 25 | README.md -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.cs linguist-language=C# 2 | -------------------------------------------------------------------------------- /.github/labeler.yml: -------------------------------------------------------------------------------- 1 | CDKey: 2 | - "src/Servers/CDKey/**" 3 | 4 | Chat: 5 | - "src/Servers/Chat/**" 6 | 7 | Game Status: 8 | - "src/Servers/GameStatus/**" 9 | 10 | Nat Negotation: 11 | - "src/Servers/NatNegotiation/**" 12 | 13 | Presence System: 14 | - "src/Servers/PresenceConnectionManager/**" 15 | - "src/Servers/PresenceSearchPlayer/**" 16 | 17 | Query Report: 18 | - "src/Servers/QueryReport/**" 19 | 20 | Server Browser: 21 | - "src/Servers/ServerBrowser/**" 22 | 23 | Web Services: 24 | - "src/Servers/WebServices/**" -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | - candidate 8 | - develop 9 | pull_request: 10 | 11 | jobs: 12 | unispy: 13 | runs-on: ${{ matrix.os }} 14 | strategy: 15 | matrix: 16 | os: [ ubuntu-latest, windows-latest, macos-latest ] 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Setup .NET 21 | uses: actions/setup-dotnet@v1 22 | with: 23 | dotnet-version: '6.0.100' 24 | - name: Install dependencies 25 | run: dotnet restore 26 | - name: Build 27 | run: dotnet build --no-restore -------------------------------------------------------------------------------- /.github/workflows/labeler.yml: -------------------------------------------------------------------------------- 1 | name: "Pull Request Labeler" 2 | on: 3 | - pull_request_target 4 | 5 | jobs: 6 | triage: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/labeler@v3 10 | with: 11 | repo-token: "${{ secrets.GITHUB_TOKEN }}" 12 | sync-labels: true -------------------------------------------------------------------------------- /BuildUniSpyServer.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | ECHO Building UniSpyServer! 3 | cd %0 4 | dotnet build -------------------------------------------------------------------------------- /BuildUniSpyServer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Building UniSpyServer!" 3 | cd "$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" 4 | dotnet build 5 | echo "Copy UniSpyServer.cfg to build directory" 6 | cp ./common/UniSpyServer.cfg ./build/Debug/net5.0/ -------------------------------------------------------------------------------- /common/DatabaseModelGenerator/GenerateDatabaseModelLinux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Creating projects" 3 | dotnet new console 4 | echo "Installing ef core" 5 | dotnet tool install --global dotnet-ef 6 | echo "Adding required packages" 7 | dotnet add package Microsoft.EntityFrameworkCore.Design 8 | dotnet add package Pomelo.EntityFrameworkCore.MySql 9 | echo "Generating database models" 10 | dotnet ef dbcontext scaffold "Server=localhost;Port=3306;database=unispy;User=unispy;Password=;TreatTinyAsBoolean=true;" "Pomelo.EntityFrameworkCore.MySql" -v --output-dir ../../src/Libraries/UniSpyLib/Database/DatabaseModel/MySql -------------------------------------------------------------------------------- /common/DatabaseModelGenerator/GenerateDatabaseModelWindows.bat: -------------------------------------------------------------------------------- 1 | echo Installing ef core. 2 | dotnet tool install --global dotnet-ef 3 | echo Generating database models. 4 | dotnet ef dbcontext scaffold "Server=localhost;Port=3306;database=unispy;User=unispy;Password=;TreatTinyAsBoolean=true;" "Pomelo.EntityFrameworkCore.MySql" -v --output-dir ../../src/Libraries/UniSpyLib/Database/DatabaseModel/MySql 5 | pause -------------------------------------------------------------------------------- /common/Icon/UniSpy_Logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameProgressive/UniSpyServer/40beb3158850259a0b87c36a4fe2fc5700865e54/common/Icon/UniSpy_Logo.ico -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/BaseClass/ClientInfoBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Abstraction.BaseClass 2 | { 3 | public abstract class ClientInfoBase 4 | { 5 | public ClientInfoBase() 6 | { 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/BaseClass/EncParamBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Abstraction.BaseClass 2 | { 3 | /// 4 | /// The base class of encryption parameters 5 | /// IEncryption can use the parameter to encrypt message 6 | /// 7 | public abstract record EncParamBase { } 8 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/BaseClass/RedisClient.cs: -------------------------------------------------------------------------------- 1 | using StackExchange.Redis; 2 | using UniSpy.Server.Core.Config; 3 | 4 | namespace UniSpy.Server.Core.Abstraction.BaseClass 5 | { 6 | public class RedisClient : LinqToRedis.RedisClient where TValue : RedisKeyValueObject 7 | { 8 | public RedisClient() : base(ConfigManager.Config.Redis.RedisConnection) 9 | { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/BaseClass/RedisKeyValueObject.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Extension.Redis; 3 | 4 | namespace UniSpy.Server.Core.Abstraction.BaseClass 5 | { 6 | public record RedisKeyValueObject : LinqToRedis.RedisKeyValueObject 7 | { 8 | public RedisKeyValueObject() 9 | { 10 | } 11 | 12 | public RedisKeyValueObject(RedisDbNumber db, TimeSpan? expireTime = null) : base((int)db, expireTime) 13 | { 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/BaseClass/RequestBase.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | using UniSpy.Server.Core.Abstraction.Interface; 3 | 4 | namespace UniSpy.Server.Core.Abstraction.BaseClass 5 | { 6 | public abstract class RequestBase : IRequest 7 | { 8 | [XmlIgnoreAttribute] 9 | public object CommandName { get; protected set; } 10 | [XmlIgnoreAttribute] 11 | public object RawRequest { get; protected set; } 12 | public RequestBase() { } 13 | public RequestBase(object rawRequest) 14 | { 15 | RawRequest = rawRequest; 16 | } 17 | 18 | public abstract void Parse(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Abstraction.BaseClass 2 | { 3 | public abstract class ResultBase 4 | { 5 | public ResultBase() 6 | { 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/Interface/IClient.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Core.Abstraction.Interface 4 | { 5 | public interface ITestClient 6 | { 7 | public void TestReceived(byte[] buffer); 8 | } 9 | public interface IClient 10 | { 11 | /// 12 | /// whether log raw request and response message bytes 13 | /// 14 | /// 15 | bool IsLogRaw { get; } 16 | IConnection Connection { get; } 17 | IServer Server { get; } 18 | ICryptography Crypto { get; } 19 | // we store client info here 20 | ClientInfoBase Info { get; } 21 | public void Send(IResponse response); 22 | } 23 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/Interface/IEncryption.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Abstraction.Interface 2 | { 3 | public interface ICryptography 4 | { 5 | byte[] Encrypt(byte[] data); 6 | byte[] Decrypt(byte[] data); 7 | } 8 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/Interface/IHandler.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Core.Abstraction.Interface 4 | { 5 | public interface IHandler 6 | { 7 | void Handle(); 8 | } 9 | public interface ITestHandler 10 | { 11 | RequestBase Request { get; } 12 | ResultBase Result { get; } 13 | ResponseBase Response { get; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/Interface/IHttpRequest.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Abstraction.Interface 2 | { 3 | public interface IHttpRequest 4 | { 5 | byte[] BodyBytes { get; } 6 | string Body { get; } 7 | long Cookies { get; } 8 | long Headers { get; } 9 | string Protocol { get; } 10 | string Url { get; } 11 | string Method { get; } 12 | bool KeepAlive { get; } 13 | } 14 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/Interface/IRedisChannelEvent.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Abstraction.Interface 2 | { 3 | public interface IRedisChannelEvent 4 | { 5 | void StartSubscribe(); 6 | void ReceivedMessage(); 7 | void PublishMessage(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/Interface/IRequest.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace UniSpy.Server.Core.Abstraction.Interface 3 | { 4 | public interface IRequest 5 | { 6 | object CommandName { get; } 7 | object RawRequest { get; } 8 | void Parse(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/Interface/IResponse.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Abstraction.Interface 2 | { 3 | public interface IResponse 4 | { 5 | object SendingBuffer { get; } 6 | void Build(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/Interface/IServer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net; 3 | using StackExchange.Redis; 4 | 5 | namespace UniSpy.Server.Core.Abstraction.Interface 6 | { 7 | /// 8 | /// Represents unispy server instance 9 | /// 10 | public interface IServer 11 | { 12 | static IConnectionMultiplexer RedisConnection { get; } 13 | Guid Id { get; } 14 | string Name { get; } 15 | IPEndPoint ListeningIPEndPoint { get; } 16 | IPEndPoint PublicIPEndPoint { get; } 17 | // UniSpyServerConfig ServerConfig { get; } 18 | void Start(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Abstraction/Interface/ISwicher.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Abstraction.Interface 2 | { 3 | public interface ISwitcher 4 | { 5 | void Handle(); 6 | } 7 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseModel/Addrequest.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Database.DatabaseModel 2 | { 3 | /// 4 | /// Friend request. 5 | /// 6 | public partial class Addrequest 7 | { 8 | public int Addrequestid { get; set; } 9 | public int ProfileId { get; set; } 10 | public int Namespaceid { get; set; } 11 | public int Targetid { get; set; } 12 | public string Reason { get; set; } = null!; 13 | public string Syncrequested { get; set; } = null!; 14 | 15 | public virtual Profile Profile { get; set; } = null!; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseModel/Blocked.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Database.DatabaseModel 2 | { 3 | /// 4 | /// Block list. 5 | /// 6 | public partial class Blocked 7 | { 8 | public int Blockid { get; set; } 9 | public int ProfileId { get; set; } 10 | public int Namespaceid { get; set; } 11 | public int Targetid { get; set; } 12 | 13 | public virtual Profile Profile { get; set; } = null!; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseModel/Friend.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Database.DatabaseModel 2 | { 3 | /// 4 | /// Friend list. 5 | /// 6 | public partial class Friend 7 | { 8 | public int Friendid { get; set; } 9 | public int ProfileId { get; set; } 10 | public int Namespaceid { get; set; } 11 | public int Targetid { get; set; } 12 | 13 | public virtual Profile Profile { get; set; } = null!; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseModel/Game.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace UniSpy.Server.Core.Database.DatabaseModel 4 | { 5 | /// 6 | /// Game list. 7 | /// 8 | public partial class Game 9 | { 10 | public Game() 11 | { 12 | Grouplists = new HashSet(); 13 | } 14 | 15 | public int Gameid { get; set; } 16 | public string Gamename { get; set; } = null!; 17 | public string Secretkey { get; set; } 18 | public string Description { get; set; } = null!; 19 | public bool Disabled { get; set; } 20 | 21 | public virtual ICollection Grouplists { get; set; } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseModel/Grouplist.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Database.DatabaseModel 2 | { 3 | /// 4 | /// Old games use grouplist to create their game rooms. 5 | /// 6 | public partial class Grouplist 7 | { 8 | public int Groupid { get; set; } 9 | public int Gameid { get; set; } 10 | public string Roomname { get; set; } = null!; 11 | 12 | public virtual Game Game { get; set; } = null!; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseModel/Message.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace UniSpy.Server.Core.Database.DatabaseModel 4 | { 5 | /// 6 | /// Friend messages. 7 | /// 8 | public partial class Message 9 | { 10 | public int Messageid { get; set; } 11 | public int? Namespaceid { get; set; } 12 | public int? Type { get; set; } 13 | public int From { get; set; } 14 | public int To { get; set; } 15 | public DateTime Date { get; set; } 16 | public string Message1 { get; set; } = null!; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseModel/Partner.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Database.DatabaseModel 2 | { 3 | /// 4 | /// Partner information, these information are used for authentication and login. 5 | /// 6 | public partial class Partner 7 | { 8 | public int Partnerid { get; set; } 9 | public string Partnername { get; set; } = null!; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseModel/Pstorage.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace UniSpy.Server.Core.Database.DatabaseModel 5 | { 6 | /// 7 | /// Old games use pstorage to store game data. 8 | /// 9 | public partial class Pstorage 10 | { 11 | public int Pstorageid { get; set; } 12 | public int ProfileId { get; set; } 13 | public int Ptype { get; set; } 14 | public int Dindex { get; set; } 15 | [Column(TypeName = "jsonb")] 16 | public Dictionary Data { get; set; } 17 | // public string Data { get; set; } 18 | public virtual Profile Profile { get; set; } = null!; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseModel/Sakestorage.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Database.DatabaseModel 2 | { 3 | /// 4 | /// Sake storage system. 5 | /// 6 | public partial class Sakestorage 7 | { 8 | public int Sakestorageid { get; set; } 9 | public string Tableid { get; set; } = null!; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Database/DatabaseType.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Database 2 | { 3 | public enum DatabaseType 4 | { 5 | PostgreSql 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Encryption/UniSpyEncoding.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Text; 3 | 4 | namespace UniSpy.Server.Core.Encryption 5 | { 6 | public static class UniSpyEncoding 7 | { 8 | public static Func GetString => Encoding.ASCII.GetString; 9 | public static Func GetBytes => Encoding.ASCII.GetBytes; 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Exception/UniSpyException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy 2 | { 3 | public class Exception : System.Exception 4 | { 5 | public Exception() 6 | { 7 | } 8 | 9 | public Exception(string message) : base(message) 10 | { 11 | } 12 | 13 | public Exception(string message, System.Exception innerException) : base(message, innerException) 14 | { 15 | } 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Extension/DataOperationExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UniSpy.Server.Core.Database.DatabaseModel; 3 | namespace UniSpy.Server.Core.Extension 4 | { 5 | public class DataOperationExtensions 6 | { 7 | public static string GetSecretKey(string gameName) 8 | { 9 | using (var db = new UniSpyContext()) 10 | { 11 | var result = from p in db.Games 12 | where p.Gamename == gameName 13 | select new { p.Secretkey }; 14 | 15 | return result.First().Secretkey; 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Extension/Redis/RedisChannelName.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Extension.Redis 2 | { 3 | public class RedisChannelName 4 | { 5 | public const string NatNegCookieChannel = "QueryReport:NatNegCookieChannel"; 6 | public const string HeartbeatChannel = "QueryReport:HeartbeatChannel"; 7 | public const string PresenceConnectionManagerBuddyMessageChannel = "PresenceConnectionManager:BuddyMessageChannel"; 8 | public const string ChatChannelPrefix = "Chat:Channel"; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Extension/Redis/RedisDbNumber.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Extension.Redis 2 | { 3 | public enum RedisDbNumber : int 4 | { 5 | ChatChannel = 0, 6 | GameServerV1 = 1, 7 | GameServerV2 = 2, 8 | NatAddressInfo = 3, 9 | NatFailInfo = 4, 10 | GameTrafficRelay = 5 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Libraries/Core/src/Misc/BufferCacheBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Core.Misc 2 | { 3 | public abstract class BufferCacheBase 4 | { 5 | public T InCompleteBuffer { get; protected set; } 6 | 7 | protected BufferCacheBase() 8 | { 9 | } 10 | 11 | /// 12 | /// Process the incoming buffer, if buffer is complete return complete buffer, other wise return null 13 | /// 14 | /// 15 | public abstract bool ProcessBuffer(T buffer, out T completeBuffer); 16 | } 17 | } -------------------------------------------------------------------------------- /src/Libraries/Core/src/Network/NetworkEvents.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.Interface; 2 | 3 | namespace UniSpy.Server.Core.Events 4 | { 5 | public delegate void OnConnectedEventHandler(); 6 | public delegate void OnReceivedEventHandler(object buffer); 7 | public delegate void OnDisconnectedEventHandler(); 8 | public delegate IClient OnConnectingEventHandler(IConnection connection); 9 | } -------------------------------------------------------------------------------- /src/Libraries/LinqToRedis/src/Core/IRedisKey.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.LinqToRedis 2 | { 3 | public interface IRedisKey 4 | { 5 | string SearchKey { get; } 6 | string FullKey { get; } 7 | } 8 | } -------------------------------------------------------------------------------- /src/Libraries/LinqToRedis/src/Core/RedisKeyAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace UniSpy.LinqToRedis 4 | { 5 | /// 6 | /// Mark property as redis key attribute, so you can search by this key 7 | /// The key must be simple object, which mean its ToString method can out put a valid string 8 | /// Such as int, string, DateTime, Guid, IPEndPoint, etc. 9 | /// 10 | [AttributeUsage(validOn: AttributeTargets.Property | AttributeTargets.Field)] 11 | public class RedisKeyAttribute : Attribute 12 | { 13 | public RedisKeyAttribute() { } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Libraries/LinqToRedis/test/NatNeg/RedisClient.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace UniSpy.Redis.Test 3 | { 4 | internal class RedisClient : UniSpy.LinqToRedis.RedisClient 5 | { 6 | public RedisClient() : base("127.0.0.1:6379", 10) 7 | { 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/Libraries/LinqToRedis/test/NatNeg/UserInfo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.LinqToRedis; 3 | 4 | namespace UniSpy.Redis.Test 5 | { 6 | public record UserInfo : RedisKeyValueObject 7 | { 8 | [RedisKey] 9 | public Guid? ServerID { get; set; } 10 | [RedisKey] 11 | public int? Cookie { get; set; } 12 | [RedisKey] 13 | public string RemoteEndPoint { get; set; } 14 | public string UserName { get; set; } 15 | public UserInfo() : base(TimeSpan.FromMinutes(3)) 16 | { 17 | // we set the expire time to 3 minutes 18 | } 19 | 20 | } 21 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Abstraction/BaseClass/Channel/ChannelRequestBase.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace UniSpy.Server.Chat.Abstraction.BaseClass 3 | { 4 | public class ChannelRequestBase : RequestBase 5 | { 6 | public string ChannelName { get; set; } 7 | public ChannelRequestBase() { } 8 | public ChannelRequestBase(string rawRequest) : base(rawRequest) { } 9 | public override void Parse() 10 | { 11 | base.Parse(); 12 | 13 | if (_cmdParams is null || _cmdParams?.Count < 1) 14 | { 15 | throw new Chat.Exception("Channel name is missing."); 16 | } 17 | ChannelName = _cmdParams[0]; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Abstraction/BaseClass/Channel/ChannelResponseBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Abstraction.BaseClass 2 | { 3 | public abstract class ChannelResponseBase : ResponseBase 4 | { 5 | protected new ChannelRequestBase _request => (ChannelRequestBase)base._request; 6 | protected ChannelResponseBase(RequestBase request, ResultBase result) : base(request, result){ } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Abstraction/BaseClass/Message/MessageResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Abstraction.BaseClass.Message 2 | { 3 | public abstract class MessageResultBase : ResultBase 4 | { 5 | public string UserIRCPrefix { get; set; } 6 | public string TargetName { get; set; } 7 | protected MessageResultBase(){ } 8 | } 9 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Abstraction/BaseClass/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Abstraction.BaseClass 2 | { 3 | public abstract class ResponseBase : UniSpy.Server.Core.Abstraction.BaseClass.ResponseBase 4 | { 5 | public const string ServerDomain = "unispy.net"; 6 | public new string SendingBuffer{ get => (string)base.SendingBuffer; 7 | protected set => base.SendingBuffer = value; } 8 | protected new ResultBase _result => (ResultBase)base._result; 9 | protected new RequestBase _request => (RequestBase)base._request; 10 | public ResponseBase(RequestBase request, ResultBase result) : base(request, result){ } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Abstraction.BaseClass 2 | { 3 | public abstract class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 4 | { 5 | public ResultBase(){ } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Abstraction/Interface/IChatClient.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate; 2 | using UniSpy.Server.Chat.Application; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | 5 | namespace UniSpy.Server.Chat.Abstraction.Interface 6 | { 7 | public interface IChatClient : IClient 8 | { 9 | public new ClientInfo Info { get; } 10 | public RemoteClient GetRemoteClient(); 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Abstraction/Interface/IStorageOperation.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Abstraction.Interface 2 | { 3 | public interface IStorageOperation 4 | { 5 | (int userId, int profileId, bool emailVerified, bool banned) NickAndEmailLogin(string nickName, string email, string passwordHash); 6 | (int userId, int profileId, bool emailVerified, bool banned) UniqueNickLogin(string uniqueNick, int namespaceId); 7 | } 8 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Aggregate/Misc/ChatConstants.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Aggregate.Misc 2 | { 3 | public sealed class ChatConstants 4 | { 5 | //we hard coded random key here for simplisity 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Aggregate/Misc/PeerChatCTX.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Aggregate.Misc 2 | { 3 | public sealed class PeerChatCTX 4 | { 5 | public byte Buffer1; 6 | public byte Buffer2; 7 | public byte[] SBox = new byte[256]; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Aggregate/Redis/Contract/DisconnectRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Aggregate.Redis.Contract 4 | { 5 | public class DisconnectRequest : RequestBase 6 | { 7 | public DisconnectRequest() : base("DISCONNECT") 8 | { 9 | Parse(); 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Application/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Logging; 3 | 4 | namespace UniSpy.Server.Chat.Application 5 | { 6 | public class Program 7 | { 8 | static void Main(string[] args) 9 | { 10 | try 11 | { 12 | new ServerLauncher().Start(); 13 | Console.WriteLine("Press < Q > to exit. "); 14 | while (Console.ReadKey().Key != ConsoleKey.Q) { } 15 | } 16 | catch (System.Exception e) 17 | { 18 | LogWriter.LogError(e); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Application/ServerLauncher.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.Core.Abstraction.BaseClass.Factory; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | 5 | namespace UniSpy.Server.Chat.Application 6 | { 7 | public sealed class ServerLauncher : ServerLauncherBase 8 | { 9 | public static IServer Server => ServerInstances[0]; 10 | protected override List LaunchNetworkService() => new List { new Server() }; 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/CdKeyRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class CdKeyRequest : RequestBase 8 | { 9 | 10 | public string CdKey { get; private set; } 11 | public CdKeyRequest(string rawRequest) : base(rawRequest) { } 12 | public override void Parse() 13 | { 14 | base.Parse(); 15 | 16 | if (_cmdParams.Count < 1) 17 | { 18 | throw new Chat.Exception("The number of IRC cmdParams are incorrect."); 19 | } 20 | 21 | CdKey = _cmdParams[0]; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/GetUdpRelayRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class GetUdpRelayRequest : ChannelRequestBase 8 | { 9 | public GetUdpRelayRequest(string rawRequest) : base(rawRequest){ } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/LoginPreAuthRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | 8 | public sealed class LoginPreAuth : RequestBase 9 | { 10 | public LoginPreAuth(string rawRequest) : base(rawRequest){ } 11 | 12 | public string AuthToken { get; private set; } 13 | public string PartnerChallenge { get; private set; } 14 | 15 | public override void Parse() 16 | { 17 | base.Parse(); 18 | 19 | AuthToken = _cmdParams[0]; 20 | PartnerChallenge = _cmdParams[1]; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/NamesRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class NamesRequest : ChannelRequestBase 8 | { 9 | public new string ChannelName{ get => base.ChannelName; set => base.ChannelName = value; } 10 | public NamesRequest(string rawRequest) : base(rawRequest){ } 11 | public NamesRequest() { } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/PingRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class PingRequest : RequestBase 8 | { 9 | public PingRequest(string rawRequest) : base(rawRequest){ } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/PongRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class PongRequest : RequestBase 8 | { 9 | public PongRequest(string rawRequest) : base(rawRequest){ } 10 | 11 | public string EchoMessage { get; private set; } 12 | 13 | public override void Parse() 14 | { 15 | base.Parse(); 16 | 17 | if (_longParam is null) 18 | { 19 | throw new Chat.Exception("Echo message is missing."); 20 | } 21 | EchoMessage = _longParam; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/QuitRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class QuitRequest : RequestBase 8 | { 9 | public QuitRequest() { } 10 | public QuitRequest(string rawRequest) : base(rawRequest){ } 11 | 12 | public string Reason { get; set; } 13 | 14 | public override void Parse() 15 | { 16 | base.Parse(); 17 | 18 | if (_longParam is null) 19 | { 20 | throw new Chat.Exception("Quit reason is missing."); 21 | } 22 | 23 | Reason = _longParam; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/RegisterNickRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class RegisterNickRequest : RequestBase 8 | { 9 | public RegisterNickRequest(string rawRequest) : base(rawRequest){ } 10 | 11 | public string NamespaceID { get; private set; } 12 | public string UniqueNick { get; private set; } 13 | public string CDKey { get; private set; } 14 | public override void Parse() 15 | { 16 | base.Parse(); 17 | 18 | NamespaceID = _cmdParams[0]; 19 | UniqueNick = _cmdParams[1]; 20 | CDKey = _cmdParams[2]; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/SetGroupRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class SetGroupRequest : ChannelRequestBase 8 | { 9 | public SetGroupRequest(string rawRequest) : base(rawRequest){ } 10 | 11 | public string GroupName { get; private set; } 12 | public override void Parse() 13 | { 14 | base.Parse(); 15 | 16 | if (_cmdParams.Count != 1) 17 | { 18 | throw new Chat.Exception("The number of IRC cmd params in GETKEY request is incorrect."); 19 | } 20 | 21 | GroupName = _cmdParams[0]; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/UserIPRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class UserIPRequest : RequestBase 8 | { 9 | public UserIPRequest(string rawRequest) : base(rawRequest){ } 10 | 11 | public override void Parse() 12 | { 13 | base.Parse(); 14 | // USRIP content is empty! 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/General/WhoIsRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.General 5 | { 6 | 7 | public sealed class WhoIsRequest : RequestBase 8 | { 9 | public WhoIsRequest(string rawRequest) : base(rawRequest){ } 10 | 11 | public string NickName { get; private set; } 12 | 13 | public override void Parse() 14 | { 15 | base.Parse(); 16 | 17 | if (_cmdParams.Count != 1) 18 | { 19 | throw new Chat.Exception("The number of IRC cmd params in WHOIS request is incorrect."); 20 | } 21 | 22 | NickName = _cmdParams[0]; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/Message/AtmRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.Message 5 | { 6 | 7 | public sealed class AtmRequest : MessageRequestBase 8 | { 9 | public AtmRequest(string rawRequest) : base(rawRequest){ } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/Message/NoticeRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.Message 5 | { 6 | 7 | public sealed class NoticeRequest : MessageRequestBase 8 | { 9 | public NoticeRequest(string rawRequest) : base(rawRequest){ } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/Message/PrivateRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.Message 5 | { 6 | 7 | public sealed class PrivateRequest : MessageRequestBase 8 | { 9 | public PrivateRequest(string rawRequest) : base(rawRequest){ } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Request/Message/UtmRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | 4 | namespace UniSpy.Server.Chat.Contract.Request.Message 5 | { 6 | 7 | public sealed class UtmRequest : MessageRequestBase 8 | { 9 | public UtmRequest(string rawRequest) : base(rawRequest){ } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Response/General/CdKeyResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using UniSpy.Server.Chat.Aggregate.Misc; 3 | 4 | namespace UniSpy.Server.Chat.Contract.Response.General 5 | { 6 | public sealed class CdKeyResponse : ResponseBase 7 | { 8 | public CdKeyResponse(RequestBase request, ResultBase result) : base(request, result) { } 9 | 10 | public override void Build() 11 | { 12 | //CDKey is always true 13 | SendingBuffer = $":{ServerDomain} {ResponseName.CDKey} * 1 :Authenticated \r\n"; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Response/General/CryptResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using UniSpy.Server.Chat.Aggregate.Misc; 3 | using UniSpy.Server.Chat.Contract.Result.General; 4 | 5 | namespace UniSpy.Server.Chat.Contract.Response.General 6 | { 7 | public sealed class CryptResponse : ResponseBase 8 | { 9 | private new CryptResult _result => (CryptResult)base._result; 10 | public CryptResponse(RequestBase request, ResultBase result) : base(request, result) { } 11 | public override void Build() 12 | { 13 | SendingBuffer = $":{ServerDomain} {ResponseName.SecureKey} * {ChatCrypt.ClientKey} {ChatCrypt.ServerKey}\r\n"; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Response/General/LoginResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using UniSpy.Server.Chat.Aggregate.Misc; 3 | using UniSpy.Server.Chat.Contract.Result.General; 4 | 5 | namespace UniSpy.Server.Chat.Contract.Response.General 6 | { 7 | public sealed class LoginResponse : ResponseBase 8 | { 9 | private new LoginResult _result => (LoginResult)base._result; 10 | public LoginResponse(RequestBase request, ResultBase result) : base(request, result) { } 11 | 12 | public override void Build() 13 | { 14 | SendingBuffer = $":{ServerDomain} {ResponseName.Login} * {_result.UserID} {_result.ProfileId}\r\n"; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Response/General/NickResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using UniSpy.Server.Chat.Aggregate.Misc; 3 | using UniSpy.Server.Chat.Contract.Request.General; 4 | 5 | namespace UniSpy.Server.Chat.Contract.Response.General 6 | { 7 | public sealed class NickResponse : ResponseBase 8 | { 9 | private new NickRequest _request => (NickRequest)base._request; 10 | public NickResponse(RequestBase request, ResultBase result) : base(request, result) { } 11 | public override void Build() 12 | { 13 | SendingBuffer = $":{ServerDomain} {ResponseName.Welcome} {_request.NickName} :Welcome to UniSpy!\r\n"; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Response/General/PingResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using UniSpy.Server.Chat.Aggregate.Misc; 3 | using UniSpy.Server.Chat.Contract.Result.General; 4 | 5 | namespace UniSpy.Server.Chat.Contract.Response.General 6 | { 7 | public sealed class PingResponse : ResponseBase 8 | { 9 | private new PingResult _result => (PingResult)base._result; 10 | public PingResponse(RequestBase request, ResultBase result) : base(request, result) { } 11 | 12 | public override void Build() 13 | { 14 | SendingBuffer = $":{_result.RequesterIRCPrefix} {ResponseName.Pong}\r\n"; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Response/General/UserIPResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using UniSpy.Server.Chat.Aggregate.Misc; 3 | using UniSpy.Server.Chat.Contract.Result.General; 4 | 5 | namespace UniSpy.Server.Chat.Contract.Response.General 6 | { 7 | public sealed class UserIPResponse : ResponseBase 8 | { 9 | private new UserIPResult _result => (UserIPResult)base._result; 10 | public UserIPResponse(RequestBase request, ResultBase result) : base(request, result) { } 11 | 12 | public override void Build() 13 | { 14 | SendingBuffer = $":{ServerDomain} {ResponseName.UserIP} :@{_result.RemoteIPAddress}\r\n"; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Channel/GetCKeyResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.Chat.Contract.Result.Channel 5 | { 6 | public sealed class GetCKeyDataModel 7 | { 8 | public string NickName { get; set; } 9 | public string UserValues { get; set; } 10 | } 11 | public sealed class GetCKeyResult : ResultBase 12 | { 13 | public List DataResults { get; } 14 | public string ChannelName { get; set; } 15 | public GetCKeyResult() 16 | { 17 | DataResults = new List(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Channel/GetChannelKeyResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Channel 4 | { 5 | public sealed class GetChannelKeyResult : ResultBase 6 | { 7 | public string ChannelUserIRCPrefix { get; set; } 8 | public string ChannelName { get; set; } 9 | public string Values { get; set; } 10 | public GetChannelKeyResult(){ } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Channel/JoinResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Channel 4 | { 5 | public sealed class JoinResult : ResultBase 6 | { 7 | public string JoinerPrefix { get; set; } 8 | public string JoinerNickName { get; set; } 9 | public string AllChannelUserNicks { get; set; } 10 | public string ChannelModes { get; set; } 11 | 12 | // public string ChannelModes { get; set; } 13 | // public List NickNames { get; set; } 14 | public JoinResult(){ } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Channel/KickResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Channel 4 | { 5 | public sealed class KickResult : ResultBase 6 | { 7 | public string ChannelName { get; set; } 8 | public string KickerNickName { get; set; } 9 | public string KickeeNickName { get; set; } 10 | public string KickerIRCPrefix { get; set; } 11 | public KickResult(){ } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Channel/ModeResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Channel 4 | { 5 | public sealed class ModeResult : ResultBase 6 | { 7 | public string ChannelModes { get; set; } 8 | public string ChannelName { get; set; } 9 | public string JoinerNickName { get; set; } 10 | public ModeResult(){ } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Channel/NamesResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Channel 4 | { 5 | public sealed class NamesResult : ResultBase 6 | { 7 | public string AllChannelUserNicks { get; set; } 8 | public string ChannelName { get; set; } 9 | public string RequesterNickName { get; set; } 10 | public NamesResult(){ } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Channel/PartResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Channel 4 | { 5 | public sealed class PartResult : ResultBase 6 | { 7 | public string LeaverIRCPrefix { get; set; } 8 | public bool IsChannelCreator { get; set; } 9 | public string ChannelName { get; set; } 10 | public PartResult() { } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Channel/SetChannelKeyResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Channel 4 | { 5 | public sealed class SetChannelKeyResult : ResultBase 6 | { 7 | public string ChannelUserIRCPrefix { get; set; } 8 | public string ChannelName { get; set; } 9 | public SetChannelKeyResult(){ } 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Channel/TopicResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Channel 4 | { 5 | public sealed class TopicResult : ResultBase 6 | { 7 | public string ChannelName { get; set; } 8 | public string ChannelTopic { get; set; } 9 | 10 | public TopicResult(){ } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/General/CryptResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.General 4 | { 5 | public sealed class CryptResult : ResultBase 6 | { 7 | public CryptResult(){ } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/General/GetKeyResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.Chat.Contract.Result.General 5 | { 6 | public sealed class GetKeyResult : ResultBase 7 | { 8 | public List Values { get; } 9 | /// 10 | /// The reciever's nick name 11 | /// 12 | public string NickName { get; set; } 13 | public GetKeyResult() 14 | { 15 | Values = new List(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/General/ListResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.Chat.Contract.Result.General 5 | { 6 | public sealed class ListDataModel 7 | { 8 | public string ChannelName { get; set; } 9 | public int TotalChannelUsers { get; set; } 10 | public string ChannelTopic { get; set; } 11 | } 12 | 13 | public sealed class ListResult : ResultBase 14 | { 15 | public string UserIRCPrefix { get; set; } 16 | public List ChannelInfoList { get; } 17 | public ListResult() 18 | { 19 | ChannelInfoList = new List(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/General/LoginResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.General 4 | { 5 | public sealed class LoginResult : ResultBase 6 | { 7 | public int ProfileId { get; set; } 8 | public int UserID { get; set; } 9 | public LoginResult() { } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/General/PingResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.General 4 | { 5 | public sealed class PingResult : ResultBase 6 | { 7 | public string RequesterIRCPrefix { get; set; } 8 | public PingResult() 9 | { } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/General/UserIPResult.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | using UniSpy.Server.Chat.Abstraction.BaseClass; 3 | 4 | namespace UniSpy.Server.Chat.Contract.Result.General 5 | { 6 | public sealed class UserIPResult : ResultBase 7 | { 8 | public IPAddress RemoteIPAddress { get; set; } 9 | public UserIPResult(){ } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/General/WhoIsResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.Chat.Contract.Result.General 5 | { 6 | public sealed class WhoIsResult : ResultBase 7 | { 8 | public List JoinedChannelName { get; } 9 | public string NickName { get; set; } 10 | public string UserName { get; set; } 11 | public string Name { get; set; } 12 | public string PublicIPAddress { get; set; } 13 | public WhoIsResult() 14 | { 15 | JoinedChannelName = new List(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/General/WhoResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.Chat.Contract.Result.General 5 | { 6 | public sealed class WhoDataModel 7 | { 8 | public string ChannelName { get; set; } 9 | public string UserName { get; set; } 10 | public string PublicIPAddress { get; set; } 11 | public string NickName { get; set; } 12 | public string Modes { get; set; } 13 | } 14 | public sealed class WhoResult : ResultBase 15 | { 16 | public List DataModels { get; } 17 | public WhoResult() 18 | { 19 | DataModels = new List(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Message/AtmResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass.Message; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Message 4 | { 5 | public sealed class AtmResult : MessageResultBase 6 | { 7 | public AtmResult(){ } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Message/NoticeResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass.Message; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Message 4 | { 5 | public sealed class NoticeResult : MessageResultBase 6 | { 7 | public NoticeResult(){ } 8 | } 9 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Message/PrivateResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass.Message; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Message 4 | { 5 | public sealed class PrivateResult : MessageResultBase 6 | { 7 | public bool IsBroadcastMessage { get; set; } 8 | public PrivateResult(){ } 9 | } 10 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Contract/Result/Message/UtmResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass.Message; 2 | 3 | namespace UniSpy.Server.Chat.Contract.Result.Message 4 | { 5 | public sealed class UtmResult : MessageResultBase 6 | { 7 | public UtmResult(){ } 8 | } 9 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Enumerate/ChatChannelMode.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Enumerate 2 | { 3 | public enum ChatChannelMode 4 | { 5 | InviteOnly, 6 | Private, 7 | Secret, 8 | Moderated, 9 | NoExternalMessages, 10 | OnlyOpsChangeTopic, 11 | OpsObeyChannelLimit, 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Enumerate/ChatMode.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Enumerate 2 | { 3 | public enum ChatMode : int 4 | { 5 | End = 0, 6 | Ban = 1, 7 | InviteOnly = 2, 8 | Limit = 3, 9 | Private = 4, 10 | Secret = 5, 11 | Key = 6, 12 | ModeRated = 7, 13 | NoExternalMessages = 8, 14 | OlnyOPSChangeTopic = 9, 15 | OP = 10, 16 | Voice = 11, 17 | UsersHidden = 12, 18 | ReceiveWallOPS = 13, 19 | OPSObeyChannelLimit = 14, 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Enumerate/Request/ChatRequest.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Enumerate.Request 2 | { 3 | public enum ChatRequestType 4 | { 5 | CRYPT, 6 | USRIP, 7 | NICK, 8 | USER, 9 | LOGINPREAUTH, 10 | LOGIN, 11 | REGISTERNICK, 12 | QUIT, 13 | MODE, 14 | CDKEY, 15 | LIST, 16 | LISTLIMIT, 17 | JOIN, 18 | PART, 19 | PRIVMSG, 20 | NOTICE, 21 | UTM, 22 | ATM, 23 | TOPIC, 24 | SETGROUP, 25 | NAMES, 26 | WHOIS, 27 | WHO, 28 | INVITE, 29 | KICK, 30 | GETUDPRELAY, 31 | SETCHANKEY, 32 | SETCKEY, 33 | SETKEY, 34 | PONG, 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Enumerate/Request/ChatServerMessage.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Enumerate 2 | { 3 | public enum ChatServerMessage 4 | { 5 | PRIVMSG, 6 | NOTICE, 7 | UTM, 8 | ATM, 9 | PING, 10 | NICK, 11 | JOIN, 12 | PART, 13 | KICK, 14 | QUIT, 15 | KILL, 16 | TOPIC, 17 | MODE, 18 | ERROR, 19 | INVITE 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Enumerate/Response/ChatErrorCode.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Enumerate 2 | { 3 | public enum ChatErrorCode 4 | { 5 | Parse, 6 | DataOperation, 7 | ConstructResponse, 8 | NotChannelOperator, 9 | UserAlreadyInChannel, 10 | UnSupportedGame, 11 | NoError, 12 | IRCError, 13 | } 14 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/Exception.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat 2 | { 3 | public class Exception : UniSpy.Exception 4 | { 5 | public Exception() { } 6 | 7 | public Exception(string message) : base(message) { } 8 | 9 | public Exception(string message, System.Exception innerException) : base(message, innerException) { } 10 | } 11 | 12 | public class HandleLaterException : Exception 13 | { 14 | public HandleLaterException(string message) : base(message) { } 15 | } 16 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/Channel/BadChanMaskException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.Channel 4 | { 5 | public sealed class BadChanMaskException : IRCChannelException 6 | { 7 | public BadChanMaskException(){ } 8 | 9 | public BadChanMaskException(string message, string channelName) : base(message, IRCErrorCode.BadChanMask, channelName){ } 10 | 11 | public BadChanMaskException(string message, string channelName, System.Exception innerException) : base(message, IRCErrorCode.BadChanMask, channelName, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/Channel/BadChannelKeyException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.Channel 4 | { 5 | public sealed class BadChannelKeyException : IRCChannelException 6 | { 7 | public BadChannelKeyException(){ } 8 | 9 | public BadChannelKeyException(string message, string channelName) : base(message, IRCErrorCode.BadChannelKey, channelName){ } 10 | 11 | public BadChannelKeyException(string message, string channelName, System.Exception innerException) : base(message, IRCErrorCode.BadChannelKey, channelName, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/Channel/BannedFromChanException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.Channel 4 | { 5 | public sealed class BannedFromChanException : IRCChannelException 6 | { 7 | public BannedFromChanException(string message, string channelName) : base(message, IRCErrorCode.BannedFromChan, channelName){ } 8 | 9 | public BannedFromChanException(string message, string channelName, System.Exception innerException) : base(message, IRCErrorCode.BannedFromChan, channelName, innerException){ } 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/Channel/ChannelIsFullException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.Channel 4 | { 5 | public sealed class ChannelIsFullException : IRCChannelException 6 | { 7 | public ChannelIsFullException(string message, string channelName) : base(message, IRCErrorCode.ChannelIsFull, channelName){ } 8 | 9 | public ChannelIsFullException(string message, string channelName, System.Exception innerException) : base(message, IRCErrorCode.ChannelIsFull, channelName, innerException){ } 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/Channel/InviteOnlyChanException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.Channel 4 | { 5 | public sealed class InviteOnlyChanException : IRCChannelException 6 | { 7 | public InviteOnlyChanException(){ } 8 | 9 | public InviteOnlyChanException(string message, string channelName) : base(message, IRCErrorCode.InviteOnlyChan, channelName){ } 10 | 11 | public InviteOnlyChanException(string message, string channelName, System.Exception innerException) : base(message, IRCErrorCode.InviteOnlyChan, channelName, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/Channel/NoSuchChannelException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.Channel 4 | { 5 | public sealed class NoSuchChannelException : IRCChannelException 6 | { 7 | public NoSuchChannelException(){ } 8 | 9 | public NoSuchChannelException(string message, string channelName) : base(message, IRCErrorCode.NoSuchChannel, channelName){ } 10 | 11 | public NoSuchChannelException(string message, string channelName, System.Exception innerException) : base(message, IRCErrorCode.NoSuchChannel, channelName, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/General/ErrOneUSNickNameException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.General 4 | { 5 | public sealed class ErrOneUSNickNameException : IRCException 6 | { 7 | public ErrOneUSNickNameException(){ } 8 | 9 | public ErrOneUSNickNameException(string message) : base(message, IRCErrorCode.ErrOneUSNickName){ } 10 | 11 | public ErrOneUSNickNameException(string message, System.Exception innerException) : base(message, IRCErrorCode.ErrOneUSNickName, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/General/LoginFailedException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.General 4 | { 5 | public sealed class LoginFailedException : IRCException 6 | { 7 | public LoginFailedException(){ } 8 | 9 | public LoginFailedException(string message) : base(message, IRCErrorCode.LoginFailed){ } 10 | 11 | public LoginFailedException(string message, System.Exception innerException) : base(message, IRCErrorCode.LoginFailed, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/General/MoreParametersException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.General 4 | { 5 | public sealed class MoreParametersException : IRCException 6 | { 7 | public MoreParametersException(){ } 8 | 9 | public MoreParametersException(string message) : base(message, IRCErrorCode.MoreParameters){ } 10 | 11 | public MoreParametersException(string message, System.Exception innerException) : base(message, IRCErrorCode.MoreParameters, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/General/NoSuchNickException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.General 4 | { 5 | public sealed class NoSuchNickException : IRCException 6 | { 7 | public NoSuchNickException(){ } 8 | 9 | public NoSuchNickException(string message) : base(message, IRCErrorCode.NoSuchNick){ } 10 | 11 | public NoSuchNickException(string message, System.Exception innerException) : base(message, IRCErrorCode.NoSuchNick, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/General/NoUniqueNickException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.General 4 | { 5 | public sealed class NoUniqueNickException : IRCException 6 | { 7 | public NoUniqueNickException(){ } 8 | 9 | public NoUniqueNickException(string message) : base(message, IRCErrorCode.NoUniqueNick){ } 10 | 11 | public NoUniqueNickException(string message, System.Exception innerException) : base(message, IRCErrorCode.NoUniqueNick, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/General/RegisterNickFaildException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.General 4 | { 5 | public sealed class RegisterNickFaildException : IRCException 6 | { 7 | public RegisterNickFaildException(){ } 8 | 9 | public RegisterNickFaildException(string message) : base(message, IRCErrorCode.RegisterNickFailed){ } 10 | 11 | public RegisterNickFaildException(string message, System.Exception innerException) : base(message, IRCErrorCode.RegisterNickFailed, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/General/TooManyChannels.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | namespace UniSpy.Server.Chat.Error.IRC.General 3 | { 4 | public sealed class TooManyChannels : IRCException 5 | { 6 | public TooManyChannels(){ } 7 | 8 | public TooManyChannels(string message) : base(message, IRCErrorCode.TooManyChannels){ } 9 | 10 | public TooManyChannels(string message, System.Exception innerException) : base(message, IRCErrorCode.TooManyChannels, innerException){ } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Exception/IRC/General/UniqueNickExpiredException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Aggregate.Misc; 2 | 3 | namespace UniSpy.Server.Chat.Error.IRC.General 4 | { 5 | public sealed class UniqueNickExpiredException : IRCException 6 | { 7 | public UniqueNickExpiredException(){ } 8 | 9 | public UniqueNickExpiredException(string message) : base(message, IRCErrorCode.UniqueNIickExpired){ } 10 | 11 | public UniqueNickExpiredException(string message, System.Exception innerException) : base(message, IRCErrorCode.UniqueNIickExpired, innerException){ } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/Chat/src/Handler/CmdHandler/General/CdKeyHandler.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using UniSpy.Server.Chat.Abstraction.Interface; 3 | using UniSpy.Server.Chat.Contract.Request.General; 4 | using UniSpy.Server.Chat.Contract.Response.General; 5 | 6 | namespace UniSpy.Server.Chat.Handler.CmdHandler.General 7 | { 8 | 9 | public sealed class CdKeyHandler : CmdHandlerBase 10 | { 11 | private new CdKeyRequest _request => (CdKeyRequest)base._request; 12 | 13 | public CdKeyHandler(IChatClient client, CdKeyRequest request) : base(client, request){ } 14 | 15 | protected override void ResponseConstruct() 16 | { 17 | _response = new CdKeyResponse(_request, _result); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Handler/CmdHandler/General/GetUdpRelayHandler.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using UniSpy.Server.Chat.Abstraction.Interface; 3 | using UniSpy.Server.Chat.Contract.Request.General; 4 | 5 | namespace UniSpy.Server.Chat.Handler.CmdHandler.General 6 | { 7 | /// 8 | /// currently we do not know how this work 9 | /// so we do not implement it 10 | /// 11 | 12 | public sealed class GetUdpRelayHandler : CmdHandlerBase 13 | { 14 | new GetUdpRelayRequest _request => (GetUdpRelayRequest)base._request; 15 | public GetUdpRelayHandler(IChatClient client, GetUdpRelayRequest request) : base(client, request) { } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Servers/Chat/src/Handler/CmdHandler/General/UserHandler.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Chat.Abstraction.BaseClass; 2 | using UniSpy.Server.Chat.Abstraction.Interface; 3 | using UniSpy.Server.Chat.Contract.Request.General; 4 | 5 | namespace UniSpy.Server.Chat.Handler.CmdHandler.General 6 | { 7 | 8 | public sealed class UserHandler : CmdHandlerBase 9 | { 10 | private new UserRequest _request => (UserRequest)base._request; 11 | public UserHandler(IChatClient client, UserRequest request) : base(client, request){ } 12 | 13 | protected override void DataOperation() 14 | { 15 | _client.Info.UserName = _request.UserName; 16 | _client.Info.Name = _request.Name; 17 | _client.Info.IsLoggedIn = true; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Servers/Chat/test/Message/MessageRequests.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.Chat.Test.Message 2 | { 3 | public class MessageRequests 4 | { 5 | public const string AboveTheTableMsg = "ATM #GSP!room!test :hello this is a test."; 6 | 7 | public const string Notice = "NOTICE #GSP!room!test :hello this is a test."; 8 | 9 | public const string PrivateMsg = "PRIVMSG #GSP!room!test :hello this is a test."; 10 | 11 | public const string UnderTheTableMsg = "UTM #GSP!room!test :hello this is a test."; 12 | 13 | public const string ActionMsg = "PRIVMSG #GSP!room!test :\001ACTION hello this is a test.\001"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Abstraction/BaseClass/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.GameStatus.Abstraction.BaseClass 2 | { 3 | public abstract class ResponseBase : UniSpy.Server.Core.Abstraction.BaseClass.ResponseBase 4 | { 5 | protected new RequestBase _request => (RequestBase)base._request; 6 | protected new ResultBase _result => (ResultBase)base._result; 7 | protected new string SendingBuffer{ get => (string)base.SendingBuffer; set => base.SendingBuffer = value; } 8 | public ResponseBase(UniSpy.Server.Core.Abstraction.BaseClass.RequestBase request, UniSpy.Server.Core.Abstraction.BaseClass.ResultBase result) : base(request, result) 9 | { 10 | } 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.GameStatus.Abstraction.BaseClass 2 | { 3 | public abstract class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 4 | { 5 | public ResultBase() 6 | { 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Abstraction/Interface/IStorageOperation.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.GameStatus.Enumerate; 3 | 4 | namespace UniSpy.Server.GameStatus.Abstraction.Interface 5 | { 6 | public interface IStorageOperation 7 | { 8 | void CreateNewGameData(); 9 | void CreateNewPlayerData(Dictionary playerData); 10 | void UpdatePlayerData(int profileId, PersistStorageType storageType, int dataIndex, Dictionary data); 11 | int GetProfileId(string token); 12 | int GetProfileId(string cdKey, string nickName); 13 | int GetProfileId(int profileId); 14 | Dictionary GetPlayerData(int profileId, PersistStorageType storageType, int dataIndex); 15 | } 16 | } -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Application/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Logging; 3 | 4 | namespace UniSpy.Server.GameStatus.Application 5 | { 6 | public class Program 7 | { 8 | static void Main(string[] args) 9 | { 10 | try 11 | { 12 | new ServerLauncher().Start(); 13 | Console.WriteLine("Press < Q > to exit. "); 14 | while (Console.ReadKey().Key != ConsoleKey.Q) { } 15 | } 16 | catch (System.Exception e) 17 | { 18 | LogWriter.LogError(e); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Application/ServerLauncher.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.Core.Abstraction.BaseClass.Factory; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | 5 | namespace UniSpy.Server.GameStatus.Application 6 | { 7 | public sealed class ServerLauncher : ServerLauncherBase 8 | { 9 | protected override List LaunchNetworkService() => new List { new Server() }; 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Contract/Result/AuthGameResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.GameStatus.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.GameStatus.Contract.Result 4 | { 5 | public sealed class AuthGameResult : ResultBase 6 | { 7 | public int SessionKey { get; set; } 8 | public AuthGameResult() 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Contract/Result/AuthPlayerResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.GameStatus.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.GameStatus.Contract.Result 4 | { 5 | public sealed class AuthPlayerResult : ResultBase 6 | { 7 | public int? ProfileId { get; set; } 8 | public AuthPlayerResult() 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Contract/Result/GetPlayerDataResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.GameStatus.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.GameStatus.Contract.Result 5 | { 6 | public sealed class GetPlayerDataResult : ResultBase 7 | { 8 | public Dictionary KeyValues { get; set; } 9 | public GetPlayerDataResult() 10 | { 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Contract/Result/GetProfileIDResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.GameStatus.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.GameStatus.Contract.Result 4 | { 5 | public sealed class GetProfileIDResult : ResultBase 6 | { 7 | public int ProfileId { get; set; } 8 | public GetProfileIDResult() 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Contract/Result/SetPlayerDataResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.GameStatus.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.GameStatus.Contract.Result 4 | { 5 | public sealed class SetPlayerDataResult : ResultBase 6 | { 7 | public SetPlayerDataResult() 8 | { 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Enumerate/AuthMethod.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.GameStatus.Enumerate 2 | { 3 | public enum AuthMethod 4 | { 5 | Unknown, 6 | ProfileIdAuth, 7 | PartnerIdAuth, 8 | CDkeyAuth, 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Enumerate/GSErrorCode.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.GameStatus.Enumerate 2 | { 3 | /// 4 | /// In gamespy protocol there are no error response message 5 | /// from server to client, which mean we only need to make 6 | /// public error system. 7 | /// 8 | public enum GSErrorCode 9 | { 10 | General, 11 | Parse, 12 | Database, 13 | NoError 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Servers/GameStatus/src/Exception/GSException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.GameStatus 2 | { 3 | public class Exception : UniSpy.Exception 4 | { 5 | public Exception() 6 | { 7 | } 8 | 9 | public Exception(string message) : base(message) 10 | { 11 | } 12 | 13 | public Exception(string message, System.Exception innerException) : base(message, innerException) 14 | { 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/GameTrafficRelay/src/Application/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Logging; 3 | 4 | namespace UniSpy.Server.GameTrafficRelay.Application 5 | { 6 | public class Program 7 | { 8 | static void Main(string[] args) 9 | { 10 | try 11 | { 12 | new ServerLauncher().Start(); 13 | Console.WriteLine("Press < Q > to exit. "); 14 | while (Console.ReadKey().Key != ConsoleKey.Q) { } 15 | } 16 | catch (System.Exception e) 17 | { 18 | LogWriter.LogError(e); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Servers/GameTrafficRelay/src/Application/StorageOperation.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using UniSpy.Server.GameTrafficRelay.Entity; 4 | using UniSpy.Server.GameTrafficRelay.Interface; 5 | 6 | namespace UniSpy.Server.GameTrafficRelay.Application 7 | { 8 | public sealed class StorageOperation : IStorageOperation 9 | { 10 | /// 11 | /// Game relay server information redis server. 12 | /// 13 | private static RedisClient _redisClient = new RedisClient(); 14 | 15 | public static IStorageOperation Persistance = new StorageOperation(); 16 | public List GetAvaliableRelayServers() 17 | { 18 | return _redisClient.Context.ToList(); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/Servers/GameTrafficRelay/src/Contracts/NatNegotiation.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net; 3 | using Newtonsoft.Json; 4 | using UniSpy.Server.Core.Misc; 5 | 6 | namespace UniSpy.Server.GameTrafficRelay 7 | { 8 | public record NatNegotiationRequest 9 | { 10 | public uint Cookie { get; set; } 11 | public Guid ServerId { get; set; } 12 | } 13 | public record NatNegotiationResponse 14 | { 15 | [JsonConverter(typeof(IPEndPointConverter))] 16 | public IPEndPoint IPEndPoint1 { get; set; } 17 | [JsonConverter(typeof(IPEndPointConverter))] 18 | public IPEndPoint IPEndPoint2 { get; set; } 19 | } 20 | } -------------------------------------------------------------------------------- /src/Servers/GameTrafficRelay/src/Interface/IConnectionForwardClient.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.GameTrafficRelay.Interface 2 | { 3 | public interface IConnectionForwardClient 4 | { 5 | IConnectionListener GameSpyTrafficListener { get; } 6 | IConnectionForwardClient ForwardTargetClient { get; } 7 | void ForwardMessage(byte[] data); 8 | } 9 | } -------------------------------------------------------------------------------- /src/Servers/GameTrafficRelay/src/Interface/IConnectionListener.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | 3 | namespace UniSpy.Server.GameTrafficRelay.Interface 4 | { 5 | public interface IConnectionListener 6 | { 7 | IPEndPoint ListeningEndPoint { get; } 8 | // IConnectionForwardClient Client { get; } 9 | IPEndPoint GameSpyClientIPEndPoint { get; } 10 | public IConnectionListener ForwardTargetListener { get; set; } 11 | 12 | void ForwardMessage(byte[] data); 13 | void Dispose(); 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/GameTrafficRelay/src/Interface/IStorageOperation.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.GameTrafficRelay.Entity; 3 | 4 | namespace UniSpy.Server.GameTrafficRelay.Interface 5 | { 6 | public interface IStorageOperation 7 | { 8 | List GetAvaliableRelayServers(); 9 | } 10 | } -------------------------------------------------------------------------------- /src/Servers/GameTrafficRelay/src/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/Servers/GameTrafficRelay/src/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*" 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Abstraction/BaseClass/CommonRequestBase.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.NatNegotiation.Enumerate; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Abstraction.BaseClass 5 | { 6 | public abstract class CommonRequestBase : RequestBase 7 | { 8 | public NatClientIndex ClientIndex { get; protected set; } 9 | public bool UseGamePort { get; protected set; } 10 | protected CommonRequestBase(byte[] rawRequest) : base(rawRequest) 11 | { 12 | } 13 | public override void Parse() 14 | { 15 | base.Parse(); 16 | ClientIndex = (NatClientIndex)RawRequest[13]; 17 | UseGamePort = Convert.ToBoolean(RawRequest[14]); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Abstraction/BaseClass/CommonResultBase.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Net; 4 | 5 | namespace UniSpy.Server.NatNegotiation.Abstraction.BaseClass 6 | { 7 | public abstract class CommonResultBase : ResultBase 8 | { 9 | public IPEndPoint RemoteIPEndPoint { get; set; } 10 | public byte[] RemoteIPAddressBytes => RemoteIPEndPoint.Address.GetAddressBytes().ToArray(); 11 | public byte[] RemotePortBytes => BitConverter.GetBytes((ushort)RemoteIPEndPoint.Port).Reverse().ToArray(); 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Enumerate; 2 | 3 | namespace UniSpy.Server.NatNegotiation.Abstraction.BaseClass 4 | { 5 | public class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 6 | { 7 | public ResponseType? PacketType { get; set; } 8 | public ResultBase() 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Abstraction/Interface/IStorageOperation.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UniSpy.Server.NatNegotiation.Aggregate.Redis; 4 | 5 | namespace UniSpy.Server.NatNegotiation.Abstraction.Interface 6 | { 7 | public interface IStorageOperation 8 | { 9 | void UpdateInitInfo(NatAddressInfo info); 10 | int CountInitInfo(uint cookie, byte version); 11 | List GetInitInfos(Guid serverId, uint cookie); 12 | void RemoveInitInfo(NatAddressInfo info); 13 | void UpdateNatFailInfo(NatNegotiation.Aggregate.Redis.Fail.NatFailInfo info); 14 | int GetNatFailInfo(NatNegotiation.Aggregate.Redis.Fail.NatFailInfo info); 15 | } 16 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Aggregate/Misc/NatProperty.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Enumerate; 2 | 3 | namespace UniSpy.Server.NatNegotiation.Aggregate.Misc 4 | { 5 | public record NatProperty 6 | { 7 | public NatType NatType { get; set; } 8 | public NatPortMappingScheme PortMapping { get; set; } 9 | public int PortIncrement { get; set; } 10 | public bool isPortRestricted { get; set; } 11 | public bool isIPRestricted { get; set; } 12 | public NatProperty() 13 | { 14 | NatType = NatType.Unknown; 15 | PortMapping = NatPortMappingScheme.Unrecognized; 16 | isPortRestricted = false; 17 | isIPRestricted = false; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Application/ClientInfo.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Enumerate; 2 | using UniSpy.Server.Core.Abstraction.BaseClass; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Application 5 | { 6 | public sealed class ClientInfo : ClientInfoBase 7 | { 8 | public uint? Cookie { get; set; } 9 | public NatClientIndex? ClientIndex { get; set; } 10 | public bool IsNeigotiating { get; set; } 11 | public ClientInfo() : base() 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Application/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Logging; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Application 5 | { 6 | public class Program 7 | { 8 | static void Main(string[] args) 9 | { 10 | try 11 | { 12 | new ServerLauncher().Start(); 13 | Console.WriteLine("Press < Q > to exit. "); 14 | while (Console.ReadKey().Key != ConsoleKey.Q) { } 15 | } 16 | catch (System.Exception e) 17 | { 18 | LogWriter.LogError(e); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Application/ServerLauncher.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.Core.Abstraction.BaseClass.Factory; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | 5 | namespace UniSpy.Server.NatNegotiation.Application 6 | { 7 | public sealed class ServerLauncher : ServerLauncherBase 8 | { 9 | protected override List LaunchNetworkService() => new List { new Server() }; 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Request/AddressCheckRequest.cs: -------------------------------------------------------------------------------- 1 | 2 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Contract.Request 5 | { 6 | 7 | public sealed class AddressCheckRequest : CommonRequestBase 8 | { 9 | public AddressCheckRequest(byte[] rawRequest) : base(rawRequest) 10 | { 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Request/ConnectAckRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | using UniSpy.Server.NatNegotiation.Enumerate; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Contract.Request 5 | { 6 | 7 | public sealed class ConnectAckRequest : RequestBase 8 | { 9 | public NatClientIndex ClientIndex { get; private set; } 10 | public ConnectAckRequest(byte[] rawRequest) : base(rawRequest) 11 | { 12 | } 13 | public override void Parse() 14 | { 15 | base.Parse(); 16 | ClientIndex = (NatClientIndex)RawRequest[13]; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Request/ConnectRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | using UniSpy.Server.NatNegotiation.Enumerate; 3 | namespace UniSpy.Server.NatNegotiation.Contract.Request 4 | { 5 | 6 | public sealed class ConnectRequest : RequestBase 7 | { 8 | public new byte Version { get => base.Version; init => base.Version = value; } 9 | public new uint Cookie { get => base.Cookie; init => base.Cookie = value; } 10 | public NatClientIndex ClientIndex { get; init; } 11 | public ConnectRequest() { } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Request/ErtAckRequest.cs: -------------------------------------------------------------------------------- 1 | 2 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Contract.Request 5 | { 6 | 7 | public sealed class ErtAckRequest : CommonRequestBase 8 | { 9 | public ErtAckRequest(byte[] rawRequest) : base(rawRequest) 10 | { 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Request/NatifyRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.NatNegotiation.Contract.Request 4 | { 5 | 6 | public sealed class NatifyRequest : CommonRequestBase 7 | { 8 | public NatifyRequest(byte[] rawRequest) : base(rawRequest) 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Response/InitResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.NatNegotiation.Contract.Response 4 | { 5 | public sealed class InitResponse : CommonResponseBase 6 | { 7 | public InitResponse(RequestBase request, ResultBase result) : base(request, result) 8 | { 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Response/PreInitResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | using UniSpy.Server.NatNegotiation.Contract.Request; 3 | using UniSpy.Server.NatNegotiation.Contract.Result; 4 | 5 | namespace UniSpy.Server.NatNegotiation.Contract.Response 6 | { 7 | public sealed class PreInitResponse : CommonResponseBase 8 | { 9 | private new PreInitRequest _request => (PreInitRequest)base._request; 10 | private new PreInitResult _result => (PreInitResult)base._result; 11 | public PreInitResponse(PreInitRequest request, PreInitResult result) : base(request, result) 12 | { 13 | } 14 | public override void Build() 15 | { 16 | base.Build(); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Result/AddressCheckResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | using UniSpy.Server.NatNegotiation.Enumerate; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Contract.Result 5 | { 6 | public sealed class AddressCheckResult : CommonResultBase 7 | { 8 | public AddressCheckResult() 9 | { 10 | PacketType = ResponseType.AddressReply; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Result/ErtAckResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | using UniSpy.Server.NatNegotiation.Enumerate; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Contract.Result 5 | { 6 | public sealed class ErtAckResult : CommonResultBase 7 | { 8 | public ErtAckResult() 9 | { 10 | PacketType = ResponseType.ErtAck; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Result/InitResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | using UniSpy.Server.NatNegotiation.Enumerate; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Contract.Result 5 | { 6 | public sealed class InitResult : CommonResultBase 7 | { 8 | public InitResult() 9 | { 10 | PacketType = ResponseType.InitAck; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Result/NatifyResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | using UniSpy.Server.NatNegotiation.Enumerate; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Contract.Result 5 | { 6 | public sealed class NatifyResult : CommonResultBase 7 | { 8 | public NatifyResult() 9 | { 10 | PacketType = ResponseType.ErtTest; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Result/PreInitResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | using UniSpy.Server.NatNegotiation.Enumerate; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Contract.Result 5 | { 6 | public sealed class PreInitResult : ResultBase 7 | { 8 | public int ClientIndex { get; private set; } 9 | public PreInitState State { get; private set; } 10 | public int ClientID { get; private set; } 11 | public PreInitResult() 12 | { 13 | PacketType = ResponseType.PreInitAck; 14 | State = PreInitState.Ready; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Contract/Result/ReportResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.NatNegotiation.Abstraction.BaseClass; 2 | using UniSpy.Server.NatNegotiation.Enumerate; 3 | 4 | namespace UniSpy.Server.NatNegotiation.Contract.Result 5 | { 6 | public sealed class ReportResult : ResultBase 7 | { 8 | public ReportResult() 9 | { 10 | PacketType = ResponseType.ReportAck; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Enumerate/ConnectPacketStatus.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.NatNegotiation.Enumerate 2 | { 3 | public enum ConnectPacketStatus : byte 4 | { 5 | NoError, 6 | DeadHeartBeat, 7 | InitPacketTimeOut 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Enumerate/NatNegResult.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.NatNegotiation.Enumerate 2 | { 3 | public enum NatNegResult 4 | { 5 | Success, 6 | DeadBeatPartner, 7 | InitTimeOut, 8 | PingTimeOut, 9 | UnknownError, 10 | NoResult 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Enumerate/NatPortType.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.NatNegotiation.Enumerate 2 | { 3 | public enum NatPortType : byte 4 | { 5 | /// 6 | /// Use game port for nat neg 7 | /// 8 | GP, 9 | /// 10 | /// IP and Port both restricted 11 | /// 12 | NN1, 13 | /// 14 | /// IP not restricted 15 | /// 16 | NN2, 17 | /// 18 | /// Port not restriced 19 | /// 20 | NN3 21 | } 22 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Enumerate/NatPunchStrategy.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.NatNegotiation.Enumerate 2 | { 3 | 4 | public enum NatPunchStrategy 5 | { 6 | /// 7 | /// If 2 clients are guessed in same LAN and natneg fail we use public ip to negotiate 8 | /// 9 | UsingPublicIPEndPoint, 10 | /// 11 | /// If 2 clients are probabaly in same LAN, we use private ip to negotiate 12 | /// 13 | UsingPrivateIPEndpoint, 14 | /// 15 | /// If 2 clients are failed with public ip negotation, we use game relay service to redirect the game traffic 16 | /// 17 | UsingGameRelay 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Enumerate/NatStrategyType.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.NatNegotiation.Enumerate 2 | { 3 | public enum NatStrategyType 4 | { 5 | UsePublicIP, 6 | /// 7 | /// currently we disable it 8 | /// 9 | UsePrivateIP, 10 | UseGameTrafficRelay 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Enumerate/NatifyPacketType.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.NatNegotiation.Enumerate 2 | { 3 | public enum NatifyPacketType : byte 4 | { 5 | PacketMap1a, 6 | PacketMap2, 7 | PacketMap3, 8 | PacketMap1b, 9 | NumPackets 10 | } 11 | 12 | public enum PreInitState : byte 13 | { 14 | WaitingForClient = 0, 15 | WaitingForMatchUp = 1, 16 | Ready = 2 17 | } 18 | } -------------------------------------------------------------------------------- /src/Servers/NatNegotiation/src/Exception/NNException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.NatNegotiation 2 | { 3 | public class Exception : UniSpy.Exception 4 | { 5 | public Exception() 6 | { 7 | } 8 | 9 | public Exception(string message) : base(message) 10 | { 11 | } 12 | 13 | public Exception(string message, System.Exception innerException) : base(message, innerException) 14 | { 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Abstraction/BaseClass/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass 2 | { 3 | public abstract class ResponseBase : UniSpy.Server.Core.Abstraction.BaseClass.ResponseBase 4 | { 5 | protected new ResultBase _result => (ResultBase)base._result; 6 | protected new RequestBase _request => (RequestBase)base._request; 7 | public new string SendingBuffer { get => (string)base.SendingBuffer; protected set => base.SendingBuffer = value; } 8 | 9 | public ResponseBase(RequestBase request, ResultBase result) : base(request, result) 10 | { 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass 2 | { 3 | public abstract class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 4 | { 5 | public ResultBase() 6 | { 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Aggregate/Misc/Status/UserStatus.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Aggregate.Misc 4 | { 5 | /// 6 | /// This status class is for old SDK version 7 | /// 8 | public sealed class UserStatus 9 | { 10 | public GPStatusCode CurrentStatus { get; set; } 11 | public string StatusString { get; set; } 12 | public string LocationString { get; set; } 13 | public UserStatus() 14 | { 15 | CurrentStatus = GPStatusCode.Offline; 16 | StatusString = ""; 17 | LocationString = ""; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Aggregate/Redis/UserInfoRedisKey.cs: -------------------------------------------------------------------------------- 1 | // using Newtonsoft.Json; 2 | // using System; 3 | // using UniSpy.Server.Core.Abstraction.BaseClass.Redis; 4 | 5 | // namespace UniSpy.Server.PresenceConnectionManager.Handler.SystemHandler.Redis 6 | // { 7 | // public sealed class UserInfoRedisKey : RedisKey 8 | // { 9 | // [JsonProperty(Order = -2)] 10 | // public Guid ServerID { get; set; } 11 | // public string SessionHashValue { get; set; } 12 | // public UserInfoRedisKey() 13 | // { 14 | // Db = UniSpy.Server.Core.Extensions.DbNumber.GamePresence; 15 | // } 16 | // } 17 | // } -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Aggregate/Redis/UserInfoRedisOperator.cs: -------------------------------------------------------------------------------- 1 | // using UniSpy.Server.PresenceConnectionManager.Structure.Data; 2 | // using UniSpy.Server.Core.Abstraction.BaseClass.Redis; 3 | 4 | // namespace UniSpy.Server.PresenceConnectionManager.Handler.SystemHandler.Redis 5 | // { 6 | // public sealed class UserInfoRedisOperator : UniSpyRedisOperator 7 | // { 8 | // } 9 | // } 10 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Application/ClientManager.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UniSpy.Server.Core.Abstraction.BaseClass; 3 | 4 | namespace UniSpy.Server.PresenceConnectionManager.Application 5 | { 6 | public class ClientManager : ClientManagerBase 7 | { 8 | public static Client GetClient(int profileid, int? productid = null, int? namespaceId = null) 9 | { 10 | return (Client)ClientPool.Values.FirstOrDefault( 11 | c => ((ClientInfo)c.Info).SubProfileInfo.ProductId == productid 12 | && ((ClientInfo)c.Info).SubProfileInfo.ProfileId == profileid 13 | && ((ClientInfo)c.Info).SubProfileInfo.NamespaceId == namespaceId); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Application/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Logging; 3 | 4 | namespace UniSpy.Server.PresenceConnectionManager.Application 5 | { 6 | public class Program 7 | { 8 | static void Main(string[] args) 9 | { 10 | try 11 | { 12 | new ServerLauncher().Start(); 13 | Console.WriteLine("Press < Q > to exit. "); 14 | while (Console.ReadKey().Key != ConsoleKey.Q) { } 15 | } 16 | catch (System.Exception e) 17 | { 18 | LogWriter.LogError(e); 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Application/ServerLauncher.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.Core.Abstraction.BaseClass.Factory; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | 5 | namespace UniSpy.Server.PresenceConnectionManager.Application 6 | { 7 | public sealed class ServerLauncher : ServerLauncherBase 8 | { 9 | protected override List LaunchNetworkService() => new List { new Server() }; 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Request/General/KeepAliveRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Request 4 | { 5 | 6 | public sealed class KeepAliveRequest : RequestBase 7 | { 8 | public KeepAliveRequest(string rawRequest) : base(rawRequest) 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Request/General/LogoutRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Request 4 | { 5 | 6 | public sealed class LogoutRequest : RequestBase 7 | { 8 | public LogoutRequest(string rawRequest) : base(rawRequest) 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Response/General/KeepAliveResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Response 4 | { 5 | public sealed class KeepAliveResponse : ResponseBase 6 | { 7 | public KeepAliveResponse(RequestBase request, ResultBase result) : base(request, result) 8 | { 9 | } 10 | 11 | public override void Build() 12 | { 13 | SendingBuffer = @"\ka\\final\"; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Response/General/NewUserResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Contract.Request; 2 | using UniSpy.Server.PresenceSearchPlayer.Contract.Result; 3 | 4 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Response 5 | { 6 | public sealed class NewUserResponse : PresenceSearchPlayer.Contract.Response.NewUserResponse 7 | { 8 | public NewUserResponse(NewUserRequest request, NewUserResult result) : base(request, result) 9 | { 10 | } 11 | 12 | public override void Build() 13 | { 14 | SendingBuffer = $@"\nur\\userid\{_result.User.UserId}\profileid\{_result.SubProfile.ProfileId}\id\{_request.OperationID}\final\"; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Response/Profile/NewProfileResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Response 4 | { 5 | public sealed class NewProfileResponse : ResponseBase 6 | { 7 | public NewProfileResponse(RequestBase request, ResultBase result) : base(request, result) 8 | { 9 | } 10 | 11 | public override void Build() 12 | { 13 | SendingBuffer = $@"\npr\\profileid\{SendingBuffer}\id\{_request.OperationID}\final\"; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Response/Profile/RegisterCDKeyResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Response 4 | { 5 | public sealed class RegisterCDKeyResponse : ResponseBase 6 | { 7 | public RegisterCDKeyResponse(RequestBase request, ResultBase result) : base(request, result) 8 | { 9 | } 10 | 11 | public override void Build() 12 | { 13 | SendingBuffer = @"\rc\\final\"; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Response/Profile/RegisterNickResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Response 4 | { 5 | public sealed class RegisterNickResponse : ResponseBase 6 | { 7 | public RegisterNickResponse(RequestBase request, ResultBase result) : base(request, result) 8 | { 9 | } 10 | 11 | public override void Build() 12 | { 13 | SendingBuffer = $@"\rn\\id\{_request.OperationID}\final\"; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Result/Buddy/AddBuddyResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Result 4 | { 5 | public sealed class AddBuddyResult : ResultBase 6 | { 7 | public AddBuddyResult() 8 | { 9 | } 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Result/Buddy/BlockListResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Result 5 | { 6 | public sealed class BlockListResult : ResultBase 7 | { 8 | public List ProfileIdList; 9 | 10 | public BlockListResult() 11 | { 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Result/Buddy/BuddyListResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Result 5 | { 6 | public sealed class BuddyListResult : ResultBase 7 | { 8 | public List ProfileIDList { get; set; } 9 | 10 | public BuddyListResult() 11 | { 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Result/Buddy/StatusInfoResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | using UniSpy.Server.PresenceConnectionManager.Aggregate.Misc; 3 | 4 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Result 5 | { 6 | public sealed class StatusInfoResult : ResultBase 7 | { 8 | public int ProfileId { get; set; } 9 | public int ProductId { get; set; } 10 | public UserStatusInfo StatusInfo { get; set; } 11 | public StatusInfoResult() 12 | { 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Result/Buddy/StatusResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | using UniSpy.Server.PresenceConnectionManager.Aggregate.Misc; 3 | 4 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Result 5 | { 6 | public sealed class StatusResult : ResultBase 7 | { 8 | public UserStatus Status { get; set; } 9 | public StatusResult() 10 | { 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Result/PCMDefaultResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Result 4 | { 5 | public sealed class PCMDefaultResult : ResultBase 6 | { 7 | public PCMDefaultResult() 8 | { 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Contract/Result/Profile/NewProfileResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceConnectionManager.Contract.Result 4 | { 5 | public sealed class NewProfileResult : ResultBase 6 | { 7 | public int ProfileId; 8 | 9 | public NewProfileResult() 10 | { 11 | } 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Enumerate/FireWallType.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceConnectionManager.Enumerate 2 | { 3 | public enum FireWallType 4 | { 5 | // Firewall 6 | /////////// 7 | Firewall = 1, 8 | NoFirewall = 0, 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Enumerate/GPStatusCode.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceConnectionManager.Enumerate 2 | { 3 | public enum GPStatusCode 4 | { 5 | // Status 6 | ///////// 7 | Offline = 0, 8 | Online = 1, 9 | Playing = 2, 10 | Staging = 3, 11 | Chatting = 4, 12 | Away = 5, 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Enumerate/GenderType.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceConnectionManager.Enumerate 2 | { 3 | public enum GenderType : ushort 4 | { 5 | /// 6 | /// Gender is male 7 | /// 8 | Male, 9 | 10 | /// 11 | /// Gender is female 12 | /// 13 | Female, 14 | 15 | /// 16 | /// Unspecified or unknown gender, this is 17 | /// used to mask the gender when the information is queried 18 | /// 19 | Pat 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Enumerate/LoginStatus.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceConnectionManager.Enumerate 2 | { 3 | public enum LoginStatus 4 | { 5 | Connected, 6 | Processing, 7 | Completed, 8 | Disconnected 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Enumerate/LoginType.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceConnectionManager.Enumerate 2 | { 3 | /// 4 | /// This enumation defins the supported login method for the users. 5 | /// 6 | public enum LoginType : int 7 | { 8 | /// 9 | /// Login with user combo (nick@email) 10 | /// 11 | NickEmail, 12 | 13 | /// 14 | /// Login with unique nickname 15 | /// 16 | UniquenickNamespaceID, 17 | 18 | /// 19 | /// Pre-authenticated login 20 | /// 21 | AuthToken 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Enumerate/QuietModeType.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceConnectionManager.Enumerate 2 | { 3 | public enum QuietModeType : uint 4 | { 5 | // Quiet mode flags. 6 | //////////////////// 7 | SlienceNone = 0x00000000, 8 | SlienceMessage = 0x00000001, 9 | SlienceUTMS = 0x00000002, 10 | SlienceList = 0x00000004, // includes requests, auths, and revokes 11 | SlienceAll = 0xFFFFFFFF, 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Handler/CmdHandler/General/LogoutHandler.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 2 | using UniSpy.Server.PresenceConnectionManager.Application; 3 | using UniSpy.Server.PresenceConnectionManager.Contract.Request; 4 | 5 | namespace UniSpy.Server.PresenceConnectionManager.Handler.CmdHandler.General 6 | { 7 | 8 | public sealed class LogoutHandler : CmdHandlerBase 9 | { 10 | public LogoutHandler(Client client, LogoutRequest request) : base(client, request) 11 | { 12 | } 13 | 14 | protected override void DataOperation() 15 | { 16 | _client.Connection.Disconnect(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Handler/CmdHandler/General/NewUserHandler.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.Interface; 2 | using UniSpy.Server.PresenceConnectionManager.Contract.Response; 3 | 4 | 5 | namespace UniSpy.Server.PresenceConnectionManager.Handler.CmdHandler.General 6 | { 7 | public sealed class NewUserHandler : PresenceSearchPlayer.Handler.CmdHandler.NewUserHandler 8 | { 9 | public NewUserHandler(IClient client, IRequest request) : base(client, request) 10 | { 11 | } 12 | protected override void ResponseConstruct() 13 | { 14 | _response = new NewUserResponse(_request, _result); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/src/Handler/CmdHandler/Profile/RemoveBlockHandler.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.PresenceConnectionManager.Abstraction.BaseClass; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | using UniSpy.Server.PresenceConnectionManager.Application; 5 | 6 | namespace UniSpy.Server.PresenceConnectionManager.Handler.CmdHandler.Profile 7 | { 8 | 9 | public sealed class RemoveBlockHandler : LoggedInCmdHandlerBase 10 | { 11 | public RemoveBlockHandler(Client client, IRequest request) : base(client, request) 12 | { 13 | throw new NotImplementedException(); 14 | } 15 | 16 | protected override void DataOperation() 17 | { 18 | throw new NotImplementedException(); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/test/Buddy/BuddyRequests.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceConnectionManager.Test 2 | { 3 | public static class BuddyRequests 4 | { 5 | public const string AddBuddy = @"\addbuddy\\sesskey\0\newprofileid\0\reason\test\final\"; 6 | 7 | public const string DelBuddy = @"\delbuddy\\sesskey\0\delprofileid\0\final\"; 8 | 9 | public const string InviteTo = @"\inviteto\\sesskey\0\productid\0\profileid\0\final\"; 10 | 11 | //public const string StatusInfo = @"\inviteto\\sesskey\0\productid\0\profileid\0\final\"; 12 | 13 | public const string Status = @"\status\0\statstring\test\locstring\test\final\"; 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Servers/PresenceConnectionManager/test/Persist/PersistTest.cs: -------------------------------------------------------------------------------- 1 | using Xunit; 2 | namespace UniSpy.Server.PresenceConnectionManager.Test.Persist 3 | { 4 | public class PersistTest 5 | { 6 | [Fact] 7 | public void DatabaseAcessTest() 8 | { 9 | // StorageOperation.Persistance.AddNickName() 10 | // Given 11 | 12 | // When 13 | 14 | // Then 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Abstraction/BaseClass/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass 2 | { 3 | public abstract class ResponseBase : UniSpy.Server.Core.Abstraction.BaseClass.ResponseBase 4 | { 5 | protected new ResultBase _result => (ResultBase)base._result; 6 | protected new RequestBase _request => (RequestBase)base._request; 7 | public new string SendingBuffer { get => (string)base.SendingBuffer; protected set => base.SendingBuffer = value; } 8 | public ResponseBase(RequestBase request, ResultBase result) : base(request, result) 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass 2 | { 3 | public abstract class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 4 | { 5 | public ResultBase() 6 | { 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Application/Client.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Handler; 2 | using UniSpy.Server.Core.Abstraction.BaseClass; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | using UniSpy.Server.Core.Encryption; 5 | 6 | namespace UniSpy.Server.PresenceSearchPlayer.Application 7 | { 8 | public sealed class Client : ClientBase 9 | { 10 | public Client(IConnection connection, IServer server) : base(connection, server) 11 | { 12 | Info = new ClientInfo(); 13 | } 14 | 15 | protected override ISwitcher CreateSwitcher(object buffer) => new CmdSwitcher(this, UniSpyEncoding.GetString((byte[])buffer)); 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Application/ClientInfo.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Application 4 | { 5 | public sealed class ClientInfo : ClientInfoBase 6 | { 7 | public ClientInfo( ) 8 | { 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Application/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Logging; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Application 5 | { 6 | public class Program 7 | { 8 | static void Main(string[] args) 9 | { 10 | try 11 | { 12 | new ServerLauncher().Start(); 13 | Console.WriteLine("Press < Q > to exit. "); 14 | while (Console.ReadKey().Key != ConsoleKey.Q) { } 15 | } 16 | catch (System.Exception e) 17 | { 18 | LogWriter.LogError(e); 19 | } 20 | } 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Application/ServerLauncher.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.Core.Abstraction.BaseClass.Factory; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | 5 | namespace UniSpy.Server.PresenceSearchPlayer.Application 6 | { 7 | public sealed class ServerLauncher : ServerLauncherBase 8 | { 9 | protected override List LaunchNetworkService() => new List { new Server() }; 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Contract/Result/CheckResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Contract.Result 4 | { 5 | public sealed class CheckResult : ResultBase 6 | { 7 | public int? ProfileId { get; set; } 8 | public CheckResult() 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Contract/Result/NewUserResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass; 2 | using UniSpy.Server.Core.Database.DatabaseModel; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Contract.Result 5 | { 6 | public sealed class NewUserResult : ResultBase 7 | { 8 | public User User; 9 | public Profile Profile; 10 | public Subprofile SubProfile; 11 | public NewUserResult() { } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Contract/Result/NicksResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Contract.Result 5 | { 6 | public sealed class NicksDataModel 7 | { 8 | public string NickName; 9 | public string UniqueNick; 10 | } 11 | 12 | public sealed class NicksResult : ResultBase 13 | { 14 | public List DataBaseResults { get; set; } 15 | public bool IsRequireUniqueNicks { get; set; } 16 | public NicksResult() 17 | { 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Contract/Result/OthersListResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Contract.Result 5 | { 6 | public sealed class OthersListDatabaseModel 7 | { 8 | public int ProfileId; 9 | public string Uniquenick; 10 | } 11 | public sealed class OthersListResult : ResultBase 12 | { 13 | public List DatabaseResults; 14 | public OthersListResult() 15 | { 16 | DatabaseResults = new List(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Contract/Result/OthersResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Contract.Result 5 | { 6 | public sealed class OthersDatabaseModel 7 | { 8 | public int ProfileId; 9 | public string Nick; 10 | public string Uniquenick; 11 | public string Lastname; 12 | public string Firstname; 13 | public int Userid; 14 | public string Email; 15 | } 16 | 17 | public sealed class OthersResult : ResultBase 18 | { 19 | public List DatabaseResults { get; set; } 20 | public OthersResult() 21 | { 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Contract/Result/PSPDefaultResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Contract.Result 4 | { 5 | public sealed class PSPDefaultResult : ResultBase 6 | { 7 | public PSPDefaultResult() 8 | { 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Contract/Result/UniqueSearchResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Contract.Result 4 | { 5 | public sealed class UniqueSearchResult : ResultBase 6 | { 7 | public bool IsUniquenickExist; 8 | public UniqueSearchResult() 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Contract/Result/ValidResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Contract.Result 4 | { 5 | public sealed class ValidResult : ResultBase 6 | { 7 | public bool IsAccountValid; 8 | public ValidResult() 9 | { 10 | IsAccountValid = false; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Enumerator/NewUserStatus.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.PresenceSearchPlayer.Entity.Enumerator 2 | { 3 | public enum NewUserStatus 4 | { 5 | CheckAccount, 6 | AccountNotExist, 7 | AccountExist, 8 | CheckProfile, 9 | ProfileNotExist, 10 | ProfileExist, 11 | CheckSubProfile, 12 | SubProfileNotExist, 13 | SubProfileExist 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/AddBuddy/GPAddBuddyException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | using UniSpy.Server.PresenceSearchPlayer.Exception.General; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.AddBuddy 5 | { 6 | public class GPAddBuddyException : GPException 7 | { 8 | public GPAddBuddyException() : base("Unknown error occur at add buddy!", GPErrorCode.AddBuddy) 9 | { 10 | } 11 | 12 | public GPAddBuddyException(string message) : base(message, GPErrorCode.AddBuddy) 13 | { 14 | } 15 | 16 | public GPAddBuddyException(string message, System.Exception innerException) : base(message, GPErrorCode.AddBuddy, innerException) 17 | { 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/AuthAdd/GPAuthAddException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | using UniSpy.Server.PresenceSearchPlayer.Exception.General; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.AuthAdd 5 | { 6 | public class GPAuthAddException : GPException 7 | { 8 | public GPAuthAddException() : base("The adding of authentication failed!", GPErrorCode.AuthAdd) 9 | { 10 | } 11 | 12 | public GPAuthAddException(string message) : base(message, GPErrorCode.AuthAdd) 13 | { 14 | } 15 | 16 | public GPAuthAddException(string message, System.Exception innerException) : base(message, GPErrorCode.AuthAdd, innerException) 17 | { 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/BuddyMsg/GPBuddyMsgException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | using UniSpy.Server.PresenceSearchPlayer.Exception.General; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.BM 5 | { 6 | public class GPBuddyMsgException : GPException 7 | { 8 | public GPBuddyMsgException() : base("Unknown error occur when processing buddy message!", GPErrorCode.Bm) 9 | { 10 | } 11 | 12 | public GPBuddyMsgException(string message) : base(message, GPErrorCode.Bm) 13 | { 14 | } 15 | 16 | public GPBuddyMsgException(string message, System.Exception innerException) : base(message, GPErrorCode.Bm, innerException) 17 | { 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/General/GPBadSessionKeyException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.General 4 | { 5 | public class GPBadSessionKeyException : GPException 6 | { 7 | public GPBadSessionKeyException() : base("Your connection key is not valid!", GPErrorCode.BadSessionKey) 8 | { 9 | } 10 | 11 | public GPBadSessionKeyException(string message) : base(message, GPErrorCode.BadSessionKey) 12 | { 13 | } 14 | 15 | public GPBadSessionKeyException(string message, System.Exception innerException) : base(message, GPErrorCode.BadSessionKey, innerException) 16 | { 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/General/GPConnectionCloseException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.General 4 | { 5 | public class GPConnectionCloseException : GPException 6 | { 7 | public GPConnectionCloseException() : base("Client connection accidently closed!", GPErrorCode.ConnectionClose) 8 | { 9 | } 10 | 11 | public GPConnectionCloseException(string message) : base(message, GPErrorCode.ConnectionClose) 12 | { 13 | } 14 | 15 | public GPConnectionCloseException(string message, System.Exception innerException) : base(message, GPErrorCode.ConnectionClose, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/General/GPDatabaseException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.General 4 | { 5 | public class GPDatabaseException : GPException 6 | { 7 | public GPDatabaseException() : base("Database error!", GPErrorCode.DatabaseError) 8 | { 9 | } 10 | 11 | public GPDatabaseException(string message) : base(message, GPErrorCode.DatabaseError) 12 | { 13 | } 14 | 15 | public GPDatabaseException(string message, System.Exception innerException) : base(message, GPErrorCode.DatabaseError, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/General/GPForcedDisconnectException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.General 4 | { 5 | public class GPForcedDisconnectException : GPException 6 | { 7 | public GPForcedDisconnectException() : base("Client is forced to disconnect!", GPErrorCode.ForcedDisconnect) 8 | { 9 | } 10 | 11 | public GPForcedDisconnectException(string message) : base(message, GPErrorCode.ForcedDisconnect) 12 | { 13 | } 14 | 15 | public GPForcedDisconnectException(string message, System.Exception innerException) : base(message, GPErrorCode.ForcedDisconnect, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/General/GPNetworkException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.General 4 | { 5 | public class GPNetworkException : GPException 6 | { 7 | public GPNetworkException() : base("Unknown network error!", GPErrorCode.Network) 8 | { 9 | } 10 | 11 | public GPNetworkException(string message) : base(message, GPErrorCode.Network) 12 | { 13 | } 14 | 15 | public GPNetworkException(string message, System.Exception innerException) : base(message, GPErrorCode.Network, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/General/GPNotLoggedInException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.General 3 | { 4 | public class GPNotLoggedInException : GPException 5 | { 6 | public GPNotLoggedInException() : base("You are not logged in, please login first!", GPErrorCode.NotLoggedIn) 7 | { 8 | } 9 | 10 | public GPNotLoggedInException(string message) : base(message, GPErrorCode.NotLoggedIn) 11 | { 12 | } 13 | 14 | public GPNotLoggedInException(string message, System.Exception innerException) : base(message, GPErrorCode.NotLoggedIn, innerException) 15 | { 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/General/GPParseException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.General 4 | { 5 | public class GPParseException : GPException 6 | { 7 | public GPParseException() : base("Request parsing error!", GPErrorCode.Parse) 8 | { 9 | } 10 | 11 | public GPParseException(string message) : base(message, GPErrorCode.Parse) 12 | { 13 | } 14 | 15 | public GPParseException(string message, System.Exception innerException) : base(message, GPErrorCode.Parse, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/General/GPUdpLayerException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.General 4 | { 5 | public class GPUdpLayerException : GPException 6 | { 7 | public GPUdpLayerException() : base("Unkown UDP layer error!", GPErrorCode.UdpLayer) 8 | { 9 | } 10 | 11 | public GPUdpLayerException(string message) : base(message, GPErrorCode.UdpLayer) 12 | { 13 | } 14 | 15 | public GPUdpLayerException(string message, System.Exception innerException) : base(message, GPErrorCode.UdpLayer, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Login/GPLoginBadEmailException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Login 4 | { 5 | public class GPLoginBadEmailException : GPLoginException 6 | { 7 | public GPLoginBadEmailException() : base("Email provided is invalid!", GPErrorCode.LoginBadEmail) 8 | { 9 | } 10 | 11 | public GPLoginBadEmailException(string message) : base(message, GPErrorCode.LoginBadEmail) 12 | { 13 | } 14 | 15 | public GPLoginBadEmailException(string message, System.Exception innerException) : base(message, GPErrorCode.LoginBadEmail, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Login/GPLoginBadLoginTicketException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Login 4 | { 5 | public class GPLoginBadLoginTicketException : GPLoginException 6 | { 7 | public GPLoginBadLoginTicketException() : base("The login ticket is invalid!", GPErrorCode.LoginBadLoginTicket) 8 | { 9 | } 10 | 11 | public GPLoginBadLoginTicketException(string message) : base(message, GPErrorCode.LoginBadLoginTicket) 12 | { 13 | } 14 | 15 | public GPLoginBadLoginTicketException(string message, System.Exception innerException) : base(message, GPErrorCode.LoginBadLoginTicket, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Login/GPLoginBadNickException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Login 4 | { 5 | public class GPLoginBadNickException : GPLoginException 6 | { 7 | public GPLoginBadNickException() : base("Nickname is in valid!", GPErrorCode.LoginBadNick) 8 | { 9 | } 10 | 11 | public GPLoginBadNickException(string message) : base(message, GPErrorCode.LoginBadNick) 12 | { 13 | } 14 | 15 | public GPLoginBadNickException(string message, System.Exception innerException) : base(message, GPErrorCode.LoginBadNick, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Login/GPLoginBadPasswordException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Login 4 | { 5 | public class GPLoginBadPasswordException : GPLoginException 6 | { 7 | public GPLoginBadPasswordException() : base("Password provided is invalid!", GPErrorCode.LoginBadPassword) 8 | { 9 | } 10 | 11 | public GPLoginBadPasswordException(string message) : base(message, GPErrorCode.LoginBadPassword) 12 | { 13 | } 14 | 15 | public GPLoginBadPasswordException(string message, System.Exception innerException) : base(message, GPErrorCode.LoginBadPassword, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Login/GPLoginBadProfileException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Login 4 | { 5 | public class GPLoginBadProfileException : GPLoginException 6 | { 7 | public GPLoginBadProfileException() : base("User profile is damaged!", GPErrorCode.LoginBadProfile) 8 | { 9 | } 10 | 11 | public GPLoginBadProfileException(string message) : base(message, GPErrorCode.LoginBadProfile) 12 | { 13 | } 14 | 15 | public GPLoginBadProfileException(string message, System.Exception innerException) : base(message, GPErrorCode.LoginBadProfile, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Login/GPLoginBadUniquenickException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Login 4 | { 5 | public class GPLoginBadUniquenickException : GPLoginException 6 | { 7 | public GPLoginBadUniquenickException() : base("The uniquenick provided is invalid!", GPErrorCode.LoginBadUniquenick) 8 | { 9 | } 10 | 11 | public GPLoginBadUniquenickException(string message) : base(message, GPErrorCode.LoginBadUniquenick) 12 | { 13 | } 14 | 15 | public GPLoginBadUniquenickException(string message, System.Exception innerException) : base(message, GPErrorCode.LoginBadUniquenick, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Login/GPLoginServerAuthFailedException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Login 4 | { 5 | public class GPLoginServerAuthFailedException : GPLoginException 6 | { 7 | public GPLoginServerAuthFailedException() : base("Login server authentication failed!", GPErrorCode.LoginServerAuthFaild) 8 | { 9 | } 10 | 11 | public GPLoginServerAuthFailedException(string message) : base(message) 12 | { 13 | } 14 | 15 | public GPLoginServerAuthFailedException(string message, System.Exception innerException) : base(message, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Login/GPLoginTicketExpiredException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Login 4 | { 5 | public class GPLoginTicketExpiredException : GPLoginException 6 | { 7 | public GPLoginTicketExpiredException() : base("The login ticket have expired!", GPErrorCode.LoginTicketExpired) 8 | { 9 | } 10 | 11 | public GPLoginTicketExpiredException(string message) : base(message, GPErrorCode.LoginTicketExpired) 12 | { 13 | } 14 | 15 | public GPLoginTicketExpiredException(string message, System.Exception innerException) : base(message, GPErrorCode.LoginTicketExpired, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Login/GPLoginTimeOutException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Login 4 | { 5 | public class GPLoginTimeOutException : GPLoginException 6 | { 7 | public GPLoginTimeOutException() : base("Login timeout!", GPErrorCode.LoginTimeOut) 8 | { 9 | } 10 | 11 | public GPLoginTimeOutException(string message) : base(message, GPErrorCode.LoginTimeOut) 12 | { 13 | } 14 | 15 | public GPLoginTimeOutException(string message, System.Exception innerException) : base(message, GPErrorCode.LoginTimeOut, innerException) 16 | { 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/NewUser/GPNewUserBadNickException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.NewUser 4 | { 5 | public class GPNewUserBadNickException : GPNewUserException 6 | { 7 | public GPNewUserBadNickException() : base("The nickname provided is invalid!", GPErrorCode.NewUserBadNick) 8 | { 9 | } 10 | 11 | public GPNewUserBadNickException(string message) : base(message, GPErrorCode.NewUserBadNick) 12 | { 13 | } 14 | 15 | public GPNewUserBadNickException(string message, System.Exception innerException) : base(message, GPErrorCode.NewUserBadNick, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/NewUser/GPNewUserBadPasswordException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.NewUser 4 | { 5 | public class GPNewUserBadPasswordException : GPNewUserException 6 | { 7 | public GPNewUserBadPasswordException() : base("Password is invalid!", GPErrorCode.NewUserBadPasswords) 8 | { 9 | } 10 | 11 | public GPNewUserBadPasswordException(string message) : base(message, GPErrorCode.NewUserBadPasswords) 12 | { 13 | } 14 | 15 | public GPNewUserBadPasswordException(string message, System.Exception innerException) : base(message, GPErrorCode.NewUserBadPasswords, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/Status/GPStatusException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | using UniSpy.Server.PresenceSearchPlayer.Exception.General; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.Status 5 | { 6 | public class GPStatusException : GPException 7 | { 8 | public GPStatusException() : base("Unknown error happen when processing player status", GPErrorCode.Status) 9 | { 10 | } 11 | 12 | public GPStatusException(string message) : base(message, GPErrorCode.Status) 13 | { 14 | } 15 | 16 | public GPStatusException(string message, System.Exception innerException) : base(message, GPErrorCode.Status, innerException) 17 | { 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/UpdatePro/GPUpdateProBadNickException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.UpdatePro 4 | { 5 | public class GPUpdateProBadNickException : GPUpdateProException 6 | { 7 | public GPUpdateProBadNickException() : base("Nickname is invalid for updating profile!", GPErrorCode.UpdateProBadNick) 8 | { 9 | } 10 | 11 | public GPUpdateProBadNickException(string message) : base(message, GPErrorCode.UpdateProBadNick) 12 | { 13 | } 14 | 15 | public GPUpdateProBadNickException(string message, System.Exception innerException) : base(message, GPErrorCode.UpdateProBadNick, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/src/Exception/UpdateUI/GPUpdateUIBadEmailException.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Enumerate; 2 | 3 | namespace UniSpy.Server.PresenceSearchPlayer.Exception.UpdateUI 4 | { 5 | public class GPUpdateUIBadEmailException : GPUpdateUIException 6 | { 7 | public GPUpdateUIBadEmailException() : base("Email is invalid!", GPErrorCode.UpdateUIBadEmail) 8 | { 9 | } 10 | 11 | public GPUpdateUIBadEmailException(string message) : base(message, GPErrorCode.UpdateUIBadEmail) 12 | { 13 | } 14 | 15 | public GPUpdateUIBadEmailException(string message, System.Exception innerException) : base(message, GPErrorCode.UpdateUIBadEmail, innerException) 16 | { 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /src/Servers/PresenceSearchPlayer/test/GameTest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.PresenceSearchPlayer.Handler; 2 | using Xunit; 3 | 4 | namespace UniSpy.Server.PresenceSearchPlayer.Test 5 | { 6 | public class GameTest 7 | { 8 | [Fact] 9 | public void CheckTest() 10 | { 11 | var raw = @"\check\\nick\spyguy\email\spyguy@gamespy.com\pass\0000\final\"; 12 | var client = MokeObject.CreateClient(); 13 | var switcher = new CmdSwitcher(client, raw); 14 | switcher.Handle(); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/Application/Client.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.BaseClass; 2 | using UniSpy.Server.Core.Abstraction.Interface; 3 | using UniSpy.Server.QueryReport.V2.Handler; 4 | 5 | namespace UniSpy.Server.QueryReport.Application 6 | { 7 | public sealed class Client : ClientBase 8 | { 9 | public Client(IConnection connection, IServer server) : base(connection, server) 10 | { 11 | IsLogRaw = true; 12 | // launch redis channel 13 | Info = new ClientInfo(); 14 | } 15 | 16 | public new ClientInfo Info { get => (ClientInfo)base.Info; private set => base.Info = value; } 17 | 18 | 19 | protected override ISwitcher CreateSwitcher(object buffer) => new CmdSwitcher(this, (byte[])buffer); 20 | } 21 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/Application/ClientInfo.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.QueryReport.Application 4 | { 5 | public sealed class ClientInfo : ClientInfoBase 6 | { 7 | public uint? InstantKey { get; set; } 8 | public string GameSecretKey { get; set; } 9 | public ClientInfo() 10 | { 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/Application/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Logging; 3 | 4 | namespace UniSpy.Server.QueryReport.Application 5 | { 6 | public class Program 7 | { 8 | static void Main(string[] args) 9 | { 10 | try 11 | { 12 | new ServerLauncher().Start(); 13 | Console.WriteLine("Press < Q > to exit. "); 14 | while (Console.ReadKey().Key != ConsoleKey.Q) { } 15 | } 16 | catch (System.Exception e) 17 | { 18 | LogWriter.LogError(e); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/Application/ServerLauncher.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.Core.Abstraction.BaseClass.Factory; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | 5 | namespace UniSpy.Server.QueryReport.Application 6 | { 7 | public sealed class ServerLauncher : ServerLauncherBase 8 | { 9 | protected override List LaunchNetworkService() => new List { new Server() }; 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/Exception/Exception.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.QueryReport 2 | { 3 | public sealed class Exception : UniSpy.Exception 4 | { 5 | public Exception() 6 | { 7 | } 8 | 9 | public Exception(string message) : base(message) 10 | { 11 | } 12 | 13 | public Exception(string message, System.Exception innerException) : base(message, innerException) 14 | { 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V1/Abstraction/BaseClass/CmdHandlerBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.Application; 2 | 3 | namespace UniSpy.Server.QueryReport.V1.Abstraction.BaseClass 4 | { 5 | public abstract class CmdHandlerBase : UniSpy.Server.Core.Abstraction.BaseClass.CmdHandlerBase 6 | { 7 | protected new Client _client => (Client)base._client; 8 | public CmdHandlerBase(Client client, RequestBase request) : base(client, request) 9 | { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V1/Abstraction/BaseClass/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.QueryReport.V1.Abstraction.BaseClass 2 | { 3 | public abstract class ResponseBase : UniSpy.Server.Core.Abstraction.BaseClass.ResponseBase 4 | { 5 | public new string SendingBuffer { get => (string)base.SendingBuffer; protected set => base.SendingBuffer = value; } 6 | public ResponseBase(RequestBase request, ResultBase result) : base(request, result) 7 | { 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V1/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.QueryReport.V1.Abstraction.BaseClass 2 | { 3 | public abstract class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 4 | { 5 | public ResultBase() 6 | { 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V1/Abstraction/Interface/IStorageOperation.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Net; 3 | using UniSpy.Server.QueryReport.V1.Aggregation.Redis; 4 | 5 | namespace UniSpy.Server.QueryReport.V1.Abstraction.Interface 6 | { 7 | public interface IStorageOperation 8 | { 9 | List GetServersInfo(string gameName); 10 | string GetGameSecretKey(string gameName); 11 | GameServerInfo GetServerInfo(IPEndPoint endPoint); 12 | void UpdateServerInfo(GameServerInfo info); 13 | void RemoveServerInfo(IPEndPoint endPoint); 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V1/Aggregation/Enctype0.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.Interface; 2 | 3 | namespace UniSpy.Server.QueryReport.V1.Aggregate 4 | { 5 | public class Enctype0 : ICryptography 6 | { 7 | public byte[] Decrypt(byte[] data) 8 | { 9 | throw new System.NotImplementedException(); 10 | } 11 | 12 | public byte[] Encrypt(byte[] data) 13 | { 14 | throw new System.NotImplementedException(); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V1/Contract/Request/ValidateRequest.cs: -------------------------------------------------------------------------------- 1 | 2 | using UniSpy.Server.QueryReport.V1.Abstraction.BaseClass; 3 | 4 | namespace UniSpy.Server.QueryReport.V1.Contract.Request 5 | { 6 | public sealed class ValidateRequest : RequestBase 7 | { 8 | public string ValidateKey { get; private set; } 9 | public ValidateRequest(string rawRequest) : base(rawRequest) 10 | { 11 | } 12 | public override void Parse() 13 | { 14 | base.Parse(); 15 | if (!KeyValues.ContainsKey("validate")) 16 | { 17 | throw new QueryReport.Exception("validate request format not correct."); 18 | } 19 | ValidateKey = KeyValues["validate"]; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V1/Contract/Response/EchoResponse.cs: -------------------------------------------------------------------------------- 1 | 2 | using UniSpy.Server.QueryReport.V1.Abstraction.BaseClass; 3 | 4 | namespace UniSpy.Server.QueryReport.V1.Contract.Response 5 | { 6 | public sealed class EchoResponse : ResponseBase 7 | { 8 | public EchoResponse(RequestBase request) : base(request, null) 9 | { 10 | } 11 | 12 | public override void Build() 13 | { 14 | SendingBuffer = $@"/echo/{HeartbeatResponse.Challenge}/final/"; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V1/Contract/Response/HeartbeatResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V1.Abstraction.BaseClass; 2 | using UniSpy.Server.QueryReport.V1.Contract.Request; 3 | 4 | namespace UniSpy.Server.QueryReport.V1.Contract.Response 5 | { 6 | public sealed class HeartbeatResponse : ResponseBase 7 | { 8 | public const string Challenge = "000000"; 9 | public HeartbeatResponse(HeartbeatRequest request) : base(request, null) 10 | { 11 | } 12 | public override void Build() 13 | { 14 | SendingBuffer = $@"/secure/{Challenge}/final/"; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Abstraction/BaseClass/CmdHandlerBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.Interface; 2 | using UniSpy.Server.QueryReport.Application; 3 | 4 | namespace UniSpy.Server.QueryReport.V2.Abstraction.BaseClass 5 | { 6 | public abstract class CmdHandlerBase : UniSpy.Server.Core.Abstraction.BaseClass.CmdHandlerBase 7 | { 8 | protected new Client _client => (Client)base._client; 9 | protected new RequestBase _request => (RequestBase)base._request; 10 | protected new ResultBase _result { get => (ResultBase)base._result; set => base._result = value; } 11 | protected CmdHandlerBase(IClient client, IRequest request) : base(client, request) 12 | { 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Enumerate; 2 | 3 | namespace UniSpy.Server.QueryReport.V2.Abstraction.BaseClass 4 | { 5 | public abstract class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 6 | { 7 | public PacketType? PacketType { get; protected set; } 8 | public ResultBase() 9 | { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Aggregate/Misc/NatNegCookie.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | using Newtonsoft.Json; 3 | using UniSpy.Server.Core.Misc; 4 | 5 | namespace UniSpy.Server.QueryReport.V2.Aggregate.NatNeg 6 | { 7 | public record NatNegCookie 8 | { 9 | [JsonConverter(typeof(IPAddresConverter))] 10 | public IPAddress HostIPAddress { get; init; } 11 | public ushort HostPort { get; init; } 12 | [JsonConverter(typeof(IPEndPointConverter))] 13 | public IPEndPoint HeartBeatIPEndPoint { get; init; } 14 | public string GameName { get; init; } 15 | public byte[] NatNegMessage { get; init; } 16 | public uint InstantKey { get; init; } 17 | 18 | public NatNegCookie() 19 | { 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Aggregate/Redis/HeartBeatChannel.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Extension.Redis; 2 | using UniSpy.Server.Core.Abstraction.BaseClass; 3 | using UniSpy.Server.QueryReport.V2.Aggregate.Redis.GameServer; 4 | 5 | namespace UniSpy.Server.QueryReport.V2.Aggregate.Redis 6 | { 7 | public class HeartbeatChannel : RedisChannelBase 8 | { 9 | public HeartbeatChannel() : base(RedisChannelName.HeartbeatChannel) 10 | { 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Contract/Request/ChallengeRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.QueryReport.V2.Contract.Request 4 | { 5 | 6 | public sealed class ChallengeRequest : RequestBase 7 | { 8 | public ChallengeRequest(byte[] rawRequest) : base(rawRequest) 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Contract/Request/ClientMessageAckRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.QueryReport.V2.Contract.Request 4 | { 5 | 6 | public sealed class ClientMessageAckRequest : RequestBase 7 | { 8 | public ClientMessageAckRequest(byte[] rawRequest) : base(rawRequest) 9 | { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Contract/Request/EchoRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.QueryReport.V2.Contract.Request 4 | { 5 | 6 | public class EchoRequest : RequestBase 7 | { 8 | public EchoRequest(byte[] rawRequest) : base(rawRequest) 9 | { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Contract/Request/KeepAliveRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.QueryReport.V2.Contract.Request 4 | { 5 | 6 | public class KeepAliveRequest : RequestBase 7 | { 8 | public KeepAliveRequest(byte[] rawRequest) : base(rawRequest) 9 | { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Contract/Response/KeepAliveResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | using UniSpy.Server.QueryReport.V2.Contract.Request; 3 | 4 | namespace UniSpy.Server.QueryReport.V2.Contract.Response 5 | { 6 | public sealed class KeepAliveResponse : ResponseBase 7 | { 8 | public KeepAliveResponse(KeepAliveRequest request) : base(request, null) 9 | { 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Contract/Result/ChallengeResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.QueryReport.V2.Contract.Result 4 | { 5 | public sealed class ChallengeResult : ResultBase 6 | { 7 | public ChallengeResult() 8 | { 9 | PacketType = Enumerate.PacketType.Challenge; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Contract/Result/ClientMessageResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.QueryReport.V2.Contract.Result 4 | { 5 | public sealed class ClientMessageResult : ResultBase 6 | { 7 | public byte[] NatNegMessage { get; set; } 8 | public int? MessageKey { get; set; } 9 | public ClientMessageResult() 10 | { 11 | //we need to change packet type to client message then send 12 | PacketType = Enumerate.PacketType.ClientMessage; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Contract/Result/EchoResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | using UniSpy.Server.QueryReport.V2.Aggregate.Redis.GameServer; 3 | 4 | namespace UniSpy.Server.QueryReport.V2.Contract.Result 5 | { 6 | public sealed class EchoResult : ResultBase 7 | { 8 | public GameServerInfo Info { get; set; } 9 | public EchoResult() 10 | { 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Contract/Result/HeartBeatResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | using System.Net; 3 | 4 | namespace UniSpy.Server.QueryReport.V2.Contract.Result 5 | { 6 | public sealed class HeartBeatResult : ResultBase 7 | { 8 | public IPEndPoint RemoteIPEndPoint { get; set; } 9 | public HeartBeatResult() 10 | { 11 | PacketType = Enumerate.PacketType.HeartBeat; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Enumerate/HeartBeatEnum.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.QueryReport.V2.Enumerate 2 | { 3 | public enum HeartBeatReportType 4 | { 5 | ServerTeamPlayerData, 6 | ServerPlayerData, 7 | ServerData, 8 | } 9 | 10 | public enum GameServerStatus 11 | { 12 | Normal = 0, 13 | Update = 1, 14 | Shutdown = 2, 15 | // todo check this flag 16 | Playing = 3, 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Enumerate/ServerAvailability.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.QueryReport.V2.Enumerate 2 | { 3 | public enum ServerAvailability : uint 4 | { 5 | Available = 0, 6 | Waiting = 1, 7 | PermanentUnavailable = 2, 8 | TemporarilyUnavailable = 3, 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /src/Servers/QueryReport/src/V2/Handler/CmdHandler/ClientMessageAckHandler.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Abstraction.BaseClass; 2 | using UniSpy.Server.Core.Logging; 3 | using UniSpy.Server.QueryReport.Application; 4 | using UniSpy.Server.QueryReport.V2.Contract.Request; 5 | 6 | namespace UniSpy.Server.QueryReport.V2.Handler.CmdHandler 7 | { 8 | 9 | public sealed class ClientMessageAckHandler : CmdHandlerBase 10 | { 11 | public ClientMessageAckHandler(Client client, ClientMessageAckRequest request) : base(client, request) 12 | { 13 | } 14 | protected override void DataOperation() 15 | { 16 | base.DataOperation(); 17 | _client.LogInfo("Get client message ack."); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/Aggregate/GameServerFilter.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.ServerBrowser.Aggregate 2 | { 3 | public class GameServerFilter 4 | { 5 | // public static Process(List<>) 6 | } 7 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/Application/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Logging; 3 | 4 | namespace UniSpy.Server.ServerBrowser.Application 5 | { 6 | public sealed class Program 7 | { 8 | static void Main(string[] args) 9 | { 10 | try 11 | { 12 | new ServerLauncher().Start(); 13 | Console.WriteLine("Press < Q > to exit. "); 14 | while (Console.ReadKey().Key != ConsoleKey.Q) { } 15 | } 16 | catch (System.Exception e) 17 | { 18 | LogWriter.LogError(e); 19 | } 20 | 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/Application/ServerLauncher.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.Core.Abstraction.BaseClass.Factory; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | 5 | namespace UniSpy.Server.ServerBrowser.Application 6 | { 7 | public sealed class ServerLauncher : ServerLauncherBase 8 | { 9 | public static IServer ServerV1 => ServerInstances[0]; 10 | public static IServer ServerV2 => ServerInstances[1]; 11 | protected override List LaunchNetworkService() => 12 | new List 13 | { 14 | new ServerBrowser.V1.Application.Server(), 15 | new ServerBrowser.V2.Application.Server() 16 | }; 17 | } 18 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/Exception/Exception.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.Interface; 2 | 3 | namespace UniSpy.Server.ServerBrowser 4 | { 5 | public class Exception : UniSpy.Exception, IResponse 6 | { 7 | public Exception() 8 | { 9 | } 10 | 11 | public Exception(string message) : base(message) 12 | { 13 | } 14 | 15 | public Exception(string message, System.Exception innerException) : base(message, innerException) 16 | { 17 | } 18 | 19 | public object SendingBuffer { get; private set; } 20 | 21 | public void Build() 22 | { 23 | SendingBuffer = @$"\error\{Message}\final\"; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V1/Abstraction/BaseClass/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.ServerBrowser.V1.Abstraction.BaseClass 2 | { 3 | public abstract class ResponseBase : UniSpy.Server.Core.Abstraction.BaseClass.ResponseBase 4 | { 5 | public new string SendingBuffer { get => (string)base.SendingBuffer; protected set => base.SendingBuffer = value; } 6 | public ResponseBase(RequestBase request, ResultBase result) : base(request, result) 7 | { 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V1/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.ServerBrowser.V1.Abstraction.BaseClass 2 | { 3 | public abstract class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 4 | { 5 | public ResultBase() 6 | { 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V1/Abstraction/Interface/IStorageOperation.cs: -------------------------------------------------------------------------------- 1 | // using System.Net; 2 | // using UniSpy.Server.ServerBrowser.V1.Aggregation.Redis; 3 | 4 | // namespace UniSpy.Server.ServerBrowser.V1.Abstraction.Interface 5 | // { 6 | // public interface IStorageOperation 7 | // { 8 | // string GetGameSecretKey(string gameName); 9 | // GameServerInfo GetServerInfo(IPEndPoint endPoint); 10 | // void UpdateServerInfo(GameServerInfo info); 11 | // void RemoveServerInfo(IPEndPoint endPoint); 12 | // } 13 | // } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V1/Application/ClientInfo.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.ServerBrowser.V1.Application 4 | { 5 | public sealed class ClientInfo : ClientInfoBase 6 | { 7 | public static string EncKey = @"000000"; 8 | public static string ChallengeResponse = $@"\basic\\secure\{EncKey}\final\"; 9 | public string GameSecretKey { get; set; } 10 | public ClientInfo() 11 | { 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V1/Contract/Response/GameNameResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.ServerBrowser.V1.Abstraction.BaseClass; 2 | 3 | namespace UniSpy.Server.ServerBrowser.V1.Contract.Response 4 | { 5 | public sealed class GameNameResponse : ResponseBase 6 | { 7 | /// 8 | /// Crypt key is 14 char long string 9 | /// 10 | public static string CryptKey = "00000000000000"; 11 | public GameNameResponse(RequestBase request, ResultBase result) : base(request, result) 12 | { 13 | } 14 | 15 | public override void Build() 16 | { 17 | throw new System.NotImplementedException(); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V1/Contract/Result/ListResult.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.QueryReport.Aggregate.Redis.PeerGroup; 3 | using UniSpy.Server.QueryReport.V1.Aggregation.Redis; 4 | using UniSpy.Server.ServerBrowser.V1.Abstraction.BaseClass; 5 | 6 | namespace UniSpy.Server.ServerBrowser.V1.Contract.Result 7 | { 8 | public sealed class ListResult : ResultBase 9 | { 10 | public List ServersInfo { get; set; } 11 | public List PeerRoomsInfo { get; set; } 12 | public ListResult() 13 | { 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Abstraction/BaseClass/AdHocResponseBase.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.ServerBrowser.V2.Contract.Result; 3 | 4 | namespace UniSpy.Server.ServerBrowser.V2.Abstraction.BaseClass 5 | { 6 | public abstract class AdHocResponseBase : ResponseBase 7 | { 8 | public new AdHocResult _result => (AdHocResult)base._result; 9 | protected List _buffer = new List(); 10 | 11 | protected AdHocResponseBase(ResultBase result) : base(null, result) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Abstraction/BaseClass/CmdHandlerBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.ServerBrowser.V2.Application; 2 | using UniSpy.Server.Core.Abstraction.Interface; 3 | 4 | namespace UniSpy.Server.ServerBrowser.V2.Abstraction.BaseClass 5 | { 6 | public abstract class CmdHandlerBase : UniSpy.Server.Core.Abstraction.BaseClass.CmdHandlerBase 7 | { 8 | protected new Client _client => (Client)base._client; 9 | protected new RequestBase _request => (RequestBase)base._request; 10 | protected new ResultBase _result { get => (ResultBase)base._result; set => base._result = value; } 11 | public CmdHandlerBase(IClient client, IRequest request) : base(client, request) 12 | { 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Abstraction/BaseClass/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.ServerBrowser.V2.Abstraction.BaseClass 2 | { 3 | public class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 4 | { 5 | public ResultBase() 6 | { 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Abstraction/BaseClass/ServerListUpdateOption/ServerListUpdateOptionResultBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.ServerBrowser.V2.Enumerate; 2 | 3 | namespace UniSpy.Server.ServerBrowser.V2.Abstraction.BaseClass 4 | { 5 | public abstract class ServerListUpdateOptionResultBase : ResultBase 6 | { 7 | public byte[] ClientRemoteIP { get; set; } 8 | public GameServerFlags Flag { get; set; } 9 | public string GameSecretKey { get; set; } 10 | protected ServerListUpdateOptionResultBase() 11 | { 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Aggregate/Misc/GameFilter.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.ServerBrowser.V2.Entity 2 | { 3 | class GameFilter 4 | { 5 | public GameFilter() 6 | { 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Aggregate/Misc/SBStringFlag.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.ServerBrowser.V2.Aggregate.Misc 2 | { 3 | public class StringFlag 4 | { 5 | public static readonly byte[] AllServerEndFlag = { 0, 255, 255, 255, 255 }; 6 | public static readonly byte StringSpliter = 0; 7 | public static readonly byte NTSStringFlag = 0xFF; 8 | 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Application/ClientManager.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.Core.Abstraction.BaseClass; 2 | using System.Linq; 3 | using System.Collections.Generic; 4 | 5 | namespace UniSpy.Server.ServerBrowser.V2.Application 6 | { 7 | public class ClientManager : ClientManagerBase 8 | { 9 | public static List GetClient(string gameName) 10 | { 11 | return ClientPool.Values.Where(c=>(((Client)c).Info).GameName == gameName).Select(c=>((Client)c)).ToList(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Contract/Request/AdHoc/SendMsgRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UniSpy.Server.ServerBrowser.V2.Abstraction; 3 | 4 | namespace UniSpy.Server.ServerBrowser.V2.Contract.Request 5 | { 6 | 7 | 8 | public class SendMsgRequest : AdHocRequestBase 9 | { 10 | public byte[] PrefixMessage { get; private set; } 11 | public byte[] ClientMessage { get; private set; } 12 | public SendMsgRequest(byte[] rawRequest) : base(rawRequest) 13 | { 14 | } 15 | public override void Parse() 16 | { 17 | base.Parse(); 18 | ClientMessage = RawRequest.Skip(9).ToArray(); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Contract/Request/AdHoc/ServerInfoRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.ServerBrowser.V2.Abstraction; 2 | 3 | namespace UniSpy.Server.ServerBrowser.V2.Contract.Request 4 | { 5 | 6 | public class ServerInfoRequest : AdHocRequestBase 7 | { 8 | public ServerInfoRequest(byte[] rawRequest) : base(rawRequest) 9 | { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Contract/Result/AdHoc/AdHocResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.QueryReport.V2.Aggregate.Redis.GameServer; 2 | using UniSpy.Server.ServerBrowser.V2.Abstraction.BaseClass; 3 | 4 | namespace UniSpy.Server.ServerBrowser.V2.Contract.Result 5 | { 6 | public sealed class AdHocResult : ResultBase 7 | { 8 | public GameServerInfo GameServerInfo { get; set; } 9 | public AdHocResult() 10 | { 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Contract/Result/ServerList/P2PGroupRoomListResult.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.QueryReport.Aggregate.Redis.PeerGroup; 3 | using UniSpy.Server.ServerBrowser.V2.Abstraction.BaseClass; 4 | 5 | namespace UniSpy.Server.ServerBrowser.V2.Contract.Result 6 | { 7 | public sealed class P2PGroupRoomListResult : ServerListUpdateOptionResultBase 8 | { 9 | public List PeerRoomsInfo { get; set; } 10 | public P2PGroupRoomListResult() 11 | { 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Contract/Result/ServerList/ServerMainListResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.ServerBrowser.V2.Abstraction.BaseClass; 2 | using System.Collections.Generic; 3 | using UniSpy.Server.QueryReport.V2.Aggregate.Redis.GameServer; 4 | 5 | namespace UniSpy.Server.ServerBrowser.V2.Contract.Result 6 | { 7 | public class ServerMainListResult : ServerListUpdateOptionResultBase 8 | { 9 | public List GameServerInfos { get; set; } 10 | public ServerMainListResult() 11 | { 12 | GameServerInfos = new List(); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Contract/Result/ServerList/ServerNetworkInfoListResult.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.QueryReport.V2.Aggregate.Redis.GameServer; 3 | 4 | namespace UniSpy.Server.ServerBrowser.V2.Contract.Result.ServerList 5 | { 6 | 7 | public sealed class ServerNetworkInfoListResult : ServerMainListResult 8 | { 9 | public List ServersInfo { get; private set; } 10 | public ServerNetworkInfoListResult() 11 | { 12 | ServersInfo = new List(); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/src/V2/Enumerate/GeneralEnum.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.ServerBrowser.V2.Enumerate 2 | { 3 | public enum PlayerSearchOptions 4 | { 5 | SearchAllGames = 1, 6 | SearchLeftSubstring = 2, 7 | SearchRightSubString = 4, 8 | SearchAnySubString = 8, 9 | } 10 | 11 | public enum QueryType 12 | { 13 | Basic, 14 | Full, 15 | ICMP 16 | } 17 | 18 | public enum DataKeyType 19 | { 20 | String, 21 | Byte, 22 | Short 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Servers/ServerBrowser/test/V2/PeerRoomTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.QueryReport.Aggregate.Redis.Channel; 3 | using Xunit; 4 | 5 | namespace UniSpy.Server.ServerBrowser.Test.V2 6 | { 7 | public class PeerRoomTest 8 | { 9 | [Fact] 10 | public void TestName() 11 | { 12 | var info = new ChannelInfo() 13 | { 14 | PreviousJoinedChannel = "", 15 | ServerId = Guid.NewGuid(), 16 | Name = "#GPG!622" 17 | }; 18 | QueryReport.Application.StorageOperation.UpdateChannel(info); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Abstraction/CmdHandlerBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Application; 2 | using UniSpy.Server.Core.Abstraction.Interface; 3 | 4 | namespace UniSpy.Server.WebServer.Abstraction 5 | { 6 | public abstract class CmdHandlerBase : UniSpy.Server.Core.Abstraction.BaseClass.CmdHandlerBase 7 | { 8 | protected new Client _client => (Client)base._client; 9 | protected CmdHandlerBase(IClient client, IRequest request) : base(client, request) 10 | { 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Abstraction/RequestBase.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Linq; 2 | 3 | namespace UniSpy.Server.WebServer.Abstraction 4 | { 5 | public abstract class RequestBase : UniSpy.Server.Core.Abstraction.BaseClass.RequestBase 6 | { 7 | public new string RawRequest => (string)base.RawRequest; 8 | protected XElement _contentElement { get; private set; } 9 | public RequestBase(string rawRequest) : base(rawRequest) 10 | { 11 | } 12 | 13 | protected RequestBase() 14 | { 15 | } 16 | public override void Parse() 17 | { 18 | dynamic xelements = XElement.Parse(RawRequest); 19 | _contentElement = xelements.FirstNode.FirstNode; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Abstraction/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Abstraction 2 | { 3 | public abstract class ResultBase : UniSpy.Server.Core.Abstraction.BaseClass.ResultBase 4 | { 5 | protected ResultBase() 6 | { 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Application/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniSpy.Server.Core.Logging; 3 | 4 | namespace UniSpy.Server.WebServer.Application 5 | { 6 | public class Program 7 | { 8 | static void Main(string[] args) 9 | { 10 | try 11 | { 12 | new ServerLauncher().Start(); 13 | Console.WriteLine("Press < Q > to exit. "); 14 | while (Console.ReadKey().Key != ConsoleKey.Q) { } 15 | } 16 | catch (System.Exception e) 17 | { 18 | LogWriter.LogError(e); 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Application/ServerLauncher.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.Core.Abstraction.BaseClass.Factory; 3 | using UniSpy.Server.Core.Abstraction.Interface; 4 | 5 | namespace UniSpy.Server.WebServer.Application 6 | { 7 | public sealed class ServerLauncher : ServerLauncherBase 8 | { 9 | public static IServer Server => ServerInstances[0]; 10 | protected override List LaunchNetworkService() => new List { new Server() }; 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Abstraction/LoginResultBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Abstraction; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Auth.Abstraction 4 | { 5 | public abstract class LoginResultBase : ResultBase 6 | { 7 | public int? ResponseCode { get; set; } 8 | public int Length { get; set; } 9 | public int UserId { get; set; } 10 | public int ProfileId { get; set; } 11 | public string ProfileNick { get; set; } 12 | public string UniqueNick { get; set; } 13 | public string CdKeyHash { get; set; } 14 | public LoginResultBase() 15 | { 16 | ResponseCode = 0; 17 | Length = 303; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Abstraction/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Abstraction; 2 | using UniSpy.Server.WebServer.Module.Auth.Contract; 3 | 4 | namespace UniSpy.Server.WebServer.Module.Auth.Abstraction 5 | { 6 | public abstract class ResponseBase : WebServer.Abstraction.ResponseBase 7 | { 8 | public ResponseBase(RequestBase request, ResultBase result) : base(request, result) 9 | { 10 | _content = new AuthSoapEnvelope(); 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Contract/AuthSoapEnvelope.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Linq; 2 | using UniSpy.Server.WebServer.Abstraction; 3 | 4 | namespace UniSpy.Server.WebServer.Module.Auth.Contract 5 | { 6 | public sealed class AuthSoapEnvelope : SoapEnvelopBase 7 | { 8 | public static XNamespace AuthNamespace = "http://gamespy.net/AuthService/"; 9 | public AuthSoapEnvelope() : base("ns1", AuthNamespace) 10 | { 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Contract/Result/LoginProfileResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Module.Auth.Abstraction; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Auth.Contract.Result 4 | { 5 | public sealed class LoginProfileResult : LoginResultBase 6 | { 7 | public LoginProfileResult() 8 | { 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Contract/Result/LoginPs3CertResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Module.Auth.Abstraction; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Auth.Contract.Result 4 | { 5 | public class LoginPs3CertResult : LoginResultBase 6 | { 7 | public string AuthToken { get; set; } 8 | public string PartnerChallenge { get; set; } 9 | public LoginPs3CertResult() 10 | { 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Contract/Result/LoginRemoteAuthResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Module.Auth.Abstraction; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Auth.Contract.Result 4 | { 5 | public sealed class LoginRemoteAuthResult : LoginResultBase 6 | { 7 | public LoginRemoteAuthResult() 8 | { 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Contract/Result/LoginUniqueNickResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Module.Auth.Abstraction; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Auth.Contract.Result 4 | { 5 | public sealed class LoginUniqueNickResult : LoginResultBase 6 | { 7 | public LoginUniqueNickResult() 8 | { 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Exception/DatabaseException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Auth 2 | { 3 | public class DatabaseException : Auth.Exception 4 | { 5 | public DatabaseException() : base("Database error!", AuthErrorCode.DatabaseError) 6 | { 7 | } 8 | public DatabaseException(string message) : base(message, AuthErrorCode.DatabaseError) 9 | { 10 | } 11 | public DatabaseException(string message, System.Exception innerException) : base(message, AuthErrorCode.DatabaseError, innerException) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Exception/InvalidPasswordException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Auth 2 | { 3 | public class InvalidPasswordException : Auth.Exception 4 | { 5 | public InvalidPasswordException() : base("Password is invalid!", AuthErrorCode.InvalidPassword) 6 | { 7 | } 8 | public InvalidPasswordException(string message) : base(message, AuthErrorCode.InvalidPassword) 9 | { 10 | } 11 | public InvalidPasswordException(string message, System.Exception innerException) : base(message, AuthErrorCode.InvalidPassword, innerException) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Exception/InvalidProfileException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Auth 2 | { 3 | public class InvalidProfileException : Auth.Exception 4 | { 5 | public InvalidProfileException() : base("Profile is invalid!", AuthErrorCode.InvalidProfile) 6 | { 7 | } 8 | public InvalidProfileException(string message) : base(message, AuthErrorCode.InvalidProfile) 9 | { 10 | } 11 | public InvalidProfileException(string message, System.Exception innerException) : base(message, AuthErrorCode.InvalidProfile, innerException) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Exception/ParseException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Auth 2 | { 3 | public class ParseException : Auth.Exception 4 | { 5 | public ParseException() : base("Parse error!", AuthErrorCode.ParseError) 6 | { 7 | } 8 | public ParseException(string message) : base(message, AuthErrorCode.ParseError) 9 | { 10 | } 11 | public ParseException(string message, System.Exception innerException) : base(message, AuthErrorCode.ParseError, innerException) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Exception/ServerException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Auth 2 | { 3 | public class ServerException : Auth.Exception 4 | { 5 | public ServerException() : base("Server error!", AuthErrorCode.ServerError) 6 | { 7 | } 8 | public ServerException(string message) : base(message, AuthErrorCode.ServerError) 9 | { 10 | } 11 | public ServerException(string message, System.Exception innerException) : base(message, AuthErrorCode.ServerError, innerException) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Exception/ServerInitException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Auth 2 | { 3 | public class ServerInitException : Auth.Exception 4 | { 5 | public ServerInitException() : base("An unknown error occur when initializing server!", AuthErrorCode.ServerError) 6 | { 7 | } 8 | public ServerInitException(string message) : base(message, AuthErrorCode.ServerError) 9 | { 10 | } 11 | public ServerInitException(string message, System.Exception innerException) : base(message, AuthErrorCode.ServerError, innerException) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Exception/UniqueNickExpredException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Auth 2 | { 3 | public class UniqueNickExpredException : Auth.Exception 4 | { 5 | public UniqueNickExpredException() : base("Nickname is invalid at creating new profile!", AuthErrorCode.UniqueNickExpired) 6 | { 7 | } 8 | public UniqueNickExpredException(string message) : base(message, AuthErrorCode.UniqueNickExpired) 9 | { 10 | } 11 | public UniqueNickExpredException(string message, System.Exception innerException) : base(message, AuthErrorCode.UniqueNickExpired, innerException) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Exception/UserNotFoundException.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Auth 2 | { 3 | public class UserNotFoundException : Auth.Exception 4 | { 5 | public UserNotFoundException() : base("User not found!", AuthErrorCode.UserNotFound) 6 | { 7 | } 8 | public UserNotFoundException(string message) : base(message, AuthErrorCode.UserNotFound) 9 | { 10 | } 11 | public UserNotFoundException(string message, System.Exception innerException) : base(message, AuthErrorCode.UserNotFound, innerException) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Handler/LoginPs3CertHandler.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Abstraction; 2 | using UniSpy.Server.WebServer.Module.Auth.Contract.Request; 3 | using UniSpy.Server.WebServer.Module.Auth.Contract.Result; 4 | using UniSpy.Server.WebServer.Application; 5 | 6 | namespace UniSpy.Server.WebServer.Module.Auth.Handler 7 | { 8 | 9 | public class LoginPs3CertHandler : CmdHandlerBase 10 | { 11 | protected new LoginPs3CertRequest _request => (LoginPs3CertRequest)base._request; 12 | protected new LoginPs3CertResult _result => (LoginPs3CertResult)base._result; 13 | public LoginPs3CertHandler(Client client, LoginPs3CertRequest request) : base(client, request) 14 | { 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Auth/Handler/LoginPs3CertWithGameIdHandler.cs: -------------------------------------------------------------------------------- 1 | 2 | using UniSpy.Server.WebServer.Module.Auth.Contract.Request; 3 | using UniSpy.Server.WebServer.Application; 4 | 5 | namespace UniSpy.Server.WebServer.Module.Auth.Handler 6 | { 7 | 8 | public sealed class LoginPs3CertWithGameIdHandler : LoginPs3CertHandler 9 | { 10 | private new LoginPs3CertWithGameIdRequest _request => (LoginPs3CertWithGameIdRequest)base._request; 11 | public LoginPs3CertWithGameIdHandler(Client client, LoginPs3CertWithGameIdRequest request) : base(client, request) 12 | { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Direct2Game/Abstraction/RequestBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Direct2Game.Abstraction; 2 | 3 | public class RequestBase : UniSpy.Server.WebServer.Abstraction.RequestBase 4 | { 5 | public RequestBase(string rawRequest) : base(rawRequest) 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Direct2Game/Abstraction/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Module.Direct2Game.Contract; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Direct2Game.Abstraction; 4 | public class ResponseBase : UniSpy.Server.WebServer.Abstraction.ResponseBase 5 | { 6 | public ResponseBase(RequestBase request, ResultBase result) : base(request, result) 7 | { 8 | _content = new Direct2GameSoapEnvelope(); 9 | } 10 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Direct2Game/Abstraction/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Direct2Game.Abstraction; 2 | public class ResultBase : UniSpy.Server.WebServer.Abstraction.ResultBase 3 | { 4 | public ResultBase() 5 | { 6 | } 7 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Direct2Game/Contract/Direct2GameSoapEnvelope.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Linq; 2 | using UniSpy.Server.WebServer.Abstraction; 3 | 4 | namespace UniSpy.Server.WebServer.Module.Direct2Game.Contract 5 | { 6 | public sealed class Direct2GameSoapEnvelope : SoapEnvelopBase 7 | { 8 | public static XNamespace Direct2GameNamespace = "http://gamespy.net/commerce/2009/02"; 9 | public Direct2GameSoapEnvelope() : base("gsc", Direct2GameNamespace) 10 | { 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Direct2Game/Contract/Result/GetPurchaseHistoryResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Module.Direct2Game.Abstraction; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Direct2Game.Contract.Result 4 | { 5 | public class GetPurchaseHistoryResult : ResultBase 6 | { 7 | public int Status { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Direct2Game/Contract/Result/GetStoreAvailabilityResult.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Module.Direct2Game.Abstraction; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Direct2Game.Contract.Result 4 | { 5 | public class GetStoreAvailabilityResult : ResultBase 6 | { 7 | public int Status { get; set; } 8 | public int StoreResult { get; set; } 9 | 10 | public GetStoreAvailabilityResult() 11 | { 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/IngameAd/Contract/Request/GetTargettedAdRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Abstraction; 2 | 3 | 4 | namespace UniSpy.Server.WebServer.Module.IngameAd.Contract.Request 5 | { 6 | 7 | public class GetTargettedAdRequest : RequestBase 8 | { 9 | public override void Parse() 10 | { 11 | throw new System.NotImplementedException(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/IngameAd/Contract/Request/ReportAdUsageRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Abstraction; 2 | 3 | 4 | namespace UniSpy.Server.WebServer.Module.IngameAd.Contract.Request 5 | { 6 | 7 | public class ReportAdUsageRequest : RequestBase 8 | { 9 | public override void Parse() 10 | { 11 | throw new System.NotImplementedException(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/PatchingAndTracking/Contract/Request/MotdRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Abstraction; 2 | 3 | 4 | namespace UniSpy.Server.WebServer.Module.PatchingAndTracking.Contract.Request 5 | { 6 | 7 | public class MotdRequest : RequestBase 8 | { 9 | public override void Parse() 10 | { 11 | throw new System.NotImplementedException(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/PatchingAndTracking/Contract/Request/VercheckRequest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Abstraction; 2 | 3 | 4 | namespace UniSpy.Server.WebServer.Module.PatchingAndTracking.Contract.Request 5 | { 6 | 7 | public class VercheckRequest : RequestBase 8 | { 9 | public override void Parse() 10 | { 11 | throw new System.NotImplementedException(); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Sake/Abstraction/ResponseBase.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Module.Sake.Contract; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Sake.Abstraction 4 | { 5 | public abstract class ResponseBase : WebServer.Abstraction.ResponseBase 6 | { 7 | public ResponseBase(RequestBase request, ResultBase result) : base(request, result) 8 | { 9 | _content = new SakeSoapEnvelope(); 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Sake/Abstraction/ResultBase.cs: -------------------------------------------------------------------------------- 1 | namespace UniSpy.Server.WebServer.Module.Sake.Abstraction; 2 | 3 | public class ResultBase : UniSpy.Server.WebServer.Abstraction.ResultBase 4 | { 5 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Sake/Contract/Request/DeleteRecordRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UniSpy.Server.WebServer.Module.Sake.Abstraction; 3 | 4 | namespace UniSpy.Server.WebServer.Module.Sake.Contract.Request 5 | { 6 | 7 | public class DeleteRecordRequest : RequestBase 8 | { 9 | public string RecordId { get; set; } 10 | public DeleteRecordRequest(string rawRequest) : base(rawRequest) 11 | { 12 | } 13 | 14 | public override void Parse() 15 | { 16 | base.Parse(); 17 | var recordid = _contentElement.Descendants().Where(p => p.Name.LocalName == "recordid").First().Value; 18 | RecordId = recordid; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Sake/Contract/Request/GetRecordLimitRequest.cs: -------------------------------------------------------------------------------- 1 | 2 | using UniSpy.Server.WebServer.Module.Sake.Abstraction; 3 | 4 | namespace UniSpy.Server.WebServer.Module.Sake.Contract.Request 5 | { 6 | 7 | public class GetRecordLimitRequest : RequestBase 8 | { 9 | public GetRecordLimitRequest(string rawRequest) : base(rawRequest) 10 | { 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Sake/Contract/Response/GetMyRecordResponse.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Abstraction; 2 | 3 | namespace UniSpy.Server.WebServer.Module.Sake.Contract.Response 4 | { 5 | public class GetMyRecordResponse : ResponseBase 6 | { 7 | public GetMyRecordResponse(RequestBase request, ResultBase result) : base(request, result) 8 | { 9 | } 10 | 11 | public override void Build() 12 | { 13 | throw new System.NotImplementedException(); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Sake/Contract/Result/CreateRecordResult.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.WebServer.Module.Sake.Abstraction; 3 | 4 | namespace UniSpy.Server.WebServer.Module.Sake.Contract.Result 5 | { 6 | public sealed class CreateRecordResult : ResultBase 7 | { 8 | public string TableID { get; init; } 9 | public string RecordID { get; init; } 10 | public List Fields { get; private set; } 11 | public CreateRecordResult() 12 | { 13 | Fields = new List(); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Sake/Contract/Result/GetMyRecordsResult.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.WebServer.Abstraction; 3 | using UniSpy.Server.WebServer.Contract; 4 | 5 | namespace UniSpy.Server.WebServer.Module.Sake.Contract.Result 6 | { 7 | public class GetMyRecordsResult : ResultBase 8 | { 9 | public List Records { get; private set; } 10 | public GetMyRecordsResult() 11 | { 12 | Records = new List(); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/Module/Sake/Contract/SakeSoapEnvelope.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Linq; 2 | using UniSpy.Server.WebServer.Abstraction; 3 | 4 | namespace UniSpy.Server.WebServer.Module.Sake.Contract 5 | { 6 | public sealed class SakeSoapEnvelope : SoapEnvelopBase 7 | { 8 | public static XNamespace SakeNamespace = "http://gamespy.net/sake"; 9 | public SakeSoapEnvelope() : base("ns1", SakeNamespace) 10 | { 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/Servers/WebServer/src/UniSpy_Logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameProgressive/UniSpyServer/40beb3158850259a0b87c36a4fe2fc5700865e54/src/Servers/WebServer/src/UniSpy_Logo.ico -------------------------------------------------------------------------------- /src/Servers/WebServer/test/Sake/HandlerTest.cs: -------------------------------------------------------------------------------- 1 | using UniSpy.Server.WebServer.Module.Sake.Handler; 2 | using UniSpy.Server.WebServer.Module.Sake.Contract.Request; 3 | using Xunit; 4 | 5 | namespace UniSpy.Server.WebServer.Test.Sake 6 | { 7 | public class HandlerTest 8 | { 9 | [Fact] 10 | public void CreateRecordTest() 11 | { 12 | var client = MokeObject.CreateClient(); 13 | var request = new CreateRecordRequest(RawRequests.CreateRecord); 14 | var handler = new CreateRecordHandler(client, request); 15 | Assert.Throws(() => handler.Handle()); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/test/TestClasses.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniSpy.Server.Core.Abstraction.Interface; 3 | 4 | namespace UniSpy.Server.Test 5 | { 6 | public static class TestClasses 7 | { 8 | public static void ServersSimulation(List> requests, Dictionary clients) 9 | { 10 | foreach (var req in requests) 11 | { 12 | ((ITestClient)clients[req.Key]).TestReceived(req.Value); 13 | } 14 | } 15 | } 16 | } --------------------------------------------------------------------------------