├── .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 | }
--------------------------------------------------------------------------------