Пример #1
0
        public MSession GetLocalToken()
        {
            MSession session;

            if (!File.Exists(TokenFile))                                      // no session data
            {
                var ClientToken = Guid.NewGuid().ToString().Replace("-", ""); // create new clienttoken

                session             = MSession.createEmpty();
                session.ClientToken = ClientToken;

                WriteLogin(session);
            }
            else // exists session data
            {
                var filedata = File.ReadAllText(TokenFile, Encoding.UTF8);
                try
                {
                    var job = JObject.Parse(filedata);
                    session             = new MSession();
                    session.AccessToken = job["session"]?.ToString();
                    session.UUID        = job["uuid"]?.ToString();
                    session.Username    = job["username"]?.ToString();
                    session.ClientToken = job["clientToken"]?.ToString();
                }
                catch (Newtonsoft.Json.JsonReaderException) // if JSON file isn't vaild
                {
                    DeleteTokenFile();
                    session = GetLocalToken();
                }
            }

            return(session);
        }
Пример #2
0
        internal static MSession createEmpty()
        {
            var session = new MSession();

            session.Username    = "";
            session.AccessToken = "";
            session.UUID        = "";
            session.ClientToken = "";
            return(session);
        }
Пример #3
0
        public static MSession GetOfflineSession(string username)
        {
            var login = new MSession();

            login.Username    = username;
            login.AccessToken = "access_token";
            login.UUID        = "user_uuid";
            login.Result      = MLoginResult.Success;
            login.Message     = "";
            login.ClientToken = "";
            return(login);
        }
        internal void CheckValid()
        {
            string exMsg = null; // error message

            if (Path == null)
            {
                exMsg = nameof(Path) + " is null";
            }

            if (MaximumRamMb < 1)
            {
                exMsg = "MaximumRamMb is too small.";
            }

            if (StartVersion == null)
            {
                exMsg = "StartVersion is null";
            }

            if (Session == null)
            {
                Session = MSession.GetOfflineSession("tester123");
            }

            if (!Session.CheckIsValid())
            {
                exMsg = "Invalid Session";
            }

            if (ServerPort < 0 || ServerPort > 65535)
            {
                exMsg = "Invalid ServerPort";
            }

            if (ScreenWidth < 0 || ScreenHeight < 0)
            {
                exMsg = "Screen Size must be greater than or equal to zero.";
            }

            if (exMsg != null) // if launch option is invalid, throw exception
            {
                throw new ArgumentException(exMsg);
            }
        }
Пример #5
0
        public MSession Refresh()
        {
            var result = new MSession();

            try
            {
                var session = GetLocalToken();

                var req = new JObject
                {
                    { "accessToken", session.AccessToken },
                    { "clientToken", session.ClientToken },
                    { "selectedProfile", new JObject()
                      {
                          { "id", session.UUID },
                          { "name", session.Username }
                      } }
                };

                var resHeader = mojangRequest("refresh", req.ToString());
                using (var res = new StreamReader(resHeader.GetResponseStream()))
                {
                    var response = res.ReadToEnd();
                    result._RawResponse = response;
                    JObject job = JObject.Parse(response);

                    result.AccessToken = job["accessToken"]?.ToString();
                    result.UUID        = job["selectedProfile"]?["id"]?.ToString();
                    result.Username    = job["selectedProfile"]?["name"]?.ToString();
                    result.ClientToken = session.ClientToken;

                    WriteLogin(result);
                    result.Result = MLoginResult.Success;
                }
            }
            catch
            {
                result.Result = MLoginResult.UnknownError;
            }

            return(result);
        }
Пример #6
0
        public MSession Validate()
        {
            var result = new MSession();

            try
            {
                var session = GetLocalToken();

                JObject job = new JObject
                {
                    { "accessToken", session.AccessToken },
                    { "clientToken", session.ClientToken }
                };

                var resHeader = mojangRequest("validate", job.ToString());
                using (var res = new StreamReader(resHeader.GetResponseStream()))
                {
                    if (resHeader.StatusCode == HttpStatusCode.NoContent) // StatusCode == 204
                    {
                        result.Result      = MLoginResult.Success;
                        result.AccessToken = session.AccessToken;
                        result.UUID        = session.UUID;
                        result.Username    = session.Username;
                        result.ClientToken = session.ClientToken;
                    }
                    else
                    {
                        result.Result = MLoginResult.NeedLogin;
                    }
                }
            }
            catch
            {
                result.Result = MLoginResult.UnknownError;
            }

            return(result);
        }
Пример #7
0
        public string[] CreateArg()
        {
            MVersion version = LaunchOption.GetStartVersion();

            var args = new List <string>();

            // Common JVM Arguments
            if (LaunchOption.JVMArguments != null)
            {
                args.AddRange(LaunchOption.JVMArguments);
            }
            else
            {
                args.AddRange(DefaultJavaParameter);

                if (LaunchOption.MaximumRamMb > 0)
                {
                    args.Add("-Xmx" + LaunchOption.MaximumRamMb + "m");
                }

                if (LaunchOption.MinimumRamMb > 0)
                {
                    args.Add("-Xms" + LaunchOption.MinimumRamMb + "m");
                }
            }

            if (!string.IsNullOrEmpty(LaunchOption.DockName))
            {
                args.Add("-Xdock:name=" + handleEmpty(LaunchOption.DockName));
            }
            if (!string.IsNullOrEmpty(LaunchOption.DockIcon))
            {
                args.Add("-Xdock:icon=" + handleEmpty(LaunchOption.DockIcon));
            }

            // Version-specific JVM Arguments
            var classpath = new List <string>(version.Libraries?.Length ?? 1);

            if (version.Libraries != null)
            {
                var libraries = version.Libraries
                                .Where(lib => lib.IsRequire && !lib.IsNative && !string.IsNullOrEmpty(lib.Path))
                                .Select(lib => Path.GetFullPath(Path.Combine(minecraftPath.Library, lib.Path !)));
                classpath.AddRange(libraries);
            }

            if (!string.IsNullOrEmpty(version.Jar))
            {
                classpath.Add(minecraftPath.GetVersionJarPath(version.Jar));
            }

            var classpathStr = IOUtil.CombinePath(classpath.ToArray());

            var native = new MNative(minecraftPath, version);

            native.CleanNatives();
            var nativePath = native.ExtractNatives();

            var jvmdict = new Dictionary <string, string?>
            {
                { "natives_directory", nativePath },
                { "launcher_name", useNotNull(LaunchOption.GameLauncherName, "minecraft-launcher") },
                { "launcher_version", useNotNull(LaunchOption.GameLauncherVersion, "2") },
                { "classpath", classpathStr }
            };

            if (version.JvmArguments != null)
            {
                args.AddRange(Mapper.MapInterpolation(version.JvmArguments, jvmdict));
            }
            else
            {
                args.Add("-Djava.library.path=" + handleEmpty(nativePath));
                args.Add("-cp " + classpathStr);
            }

            if (!string.IsNullOrEmpty(version.MainClass))
            {
                args.Add(version.MainClass);
            }

            // Game Arguments
            MSession session  = LaunchOption.GetSession();
            var      gameDict = new Dictionary <string, string?>
            {
                { "auth_player_name", session.Username },
                { "version_name", version.Id },
                { "game_directory", minecraftPath.BasePath },
                { "assets_root", minecraftPath.Assets },
                { "assets_index_name", version.AssetId ?? "legacy" },
                { "auth_uuid", session.UUID },
                { "auth_access_token", session.AccessToken },
                { "user_properties", "{}" },
                { "user_type", "Mojang" },
                { "game_assets", minecraftPath.GetAssetLegacyPath(version.AssetId ?? "legacy") },
                { "auth_session", session.AccessToken },
                { "version_type", useNotNull(LaunchOption.VersionType, version.TypeStr) }
            };

            if (version.GameArguments != null)
            {
                args.AddRange(Mapper.MapInterpolation(version.GameArguments, gameDict));
            }
            else if (!string.IsNullOrEmpty(version.MinecraftArguments))
            {
                args.AddRange(Mapper.MapInterpolation(version.MinecraftArguments.Split(' '), gameDict));
            }

            // Options
            if (!string.IsNullOrEmpty(LaunchOption.ServerIp))
            {
                args.Add("--server " + handleEmpty(LaunchOption.ServerIp));

                if (LaunchOption.ServerPort != DefaultServerPort)
                {
                    args.Add("--port " + LaunchOption.ServerPort);
                }
            }

            if (LaunchOption.ScreenWidth > 0 && LaunchOption.ScreenHeight > 0)
            {
                args.Add("--width " + LaunchOption.ScreenWidth);
                args.Add("--height " + LaunchOption.ScreenHeight);
            }

            if (LaunchOption.FullScreen)
            {
                args.Add("--fullscreen");
            }

            return(args.ToArray());
        }
Пример #8
0
 private void WriteLogin(MSession result)
 {
     WriteLogin(result.Username, result.AccessToken, result.UUID, result.ClientToken);
 }
Пример #9
0
        public MSession Authenticate(string id, string pw)
        {
            MSession result = new MSession();

            string ClientToken = GetLocalToken().ClientToken;

            var job = new JObject
            {
                { "username", id },
                { "password", pw },
                { "clientToken", ClientToken },

                { "agent", new JObject
                  {
                      { "name", "Minecraft" },
                      { "version", 1 }
                  } }
            };

            var resHeader = mojangRequest("authenticate", job.ToString());

            using (var res = new StreamReader(resHeader.GetResponseStream()))
            {
                var Response = res.ReadToEnd();

                result.ClientToken = ClientToken;

                if (resHeader.StatusCode == HttpStatusCode.OK) // ResultCode == 200
                {
                    var jObj = JObject.Parse(Response);        //json parse
                    result.AccessToken = jObj["accessToken"].ToString();
                    result.UUID        = jObj["selectedProfile"]["id"].ToString();
                    result.Username    = jObj["selectedProfile"]["name"].ToString();

                    WriteLogin(result);
                    result.Result = MLoginResult.Success;
                }
                else // fail to login
                {
                    var json = JObject.Parse(Response);

                    var error = json["error"]?.ToString();                   // error type
                    result._RawResponse = Response;
                    result.Message      = json["message"]?.ToString() ?? ""; // detail error message

                    switch (error)
                    {
                    case "Method Not Allowed":
                    case "Not Found":
                    case "Unsupported Media Type":
                        result.Result = MLoginResult.BadRequest;
                        break;

                    case "IllegalArgumentException":
                    case "ForbiddenOperationException":
                        result.Result = MLoginResult.WrongAccount;
                        break;

                    default:
                        result.Result = MLoginResult.UnknownError;
                        break;
                    }
                }

                return(result);
            }
        }