Example #1
0
        internal byte[] GetRawUpdate()
        {
            OutgoingMessage Message = new OutgoingMessage();

            Message.AppendBoolean(true);                            // TODO: Find out what this does

            Message.AppendUInt32(this.fUser.GetID());               // User ID
            Message.AppendString(this.fUser.GetUsername());         // Username

            Message.AppendBoolean(true);                            // Not sure what this does
            Message.AppendBoolean(this.fUser.IsLoggedIn());         // Logged In
            Message.AppendBoolean(this.fUser.GetRoom() != null);    // In Room
            Message.AppendString(this.fUser.GetFigure());           // Figure
            Message.AppendUInt32(this.fLocalCategory);              // Category ID

            if (this.fUser.IsLoggedIn())
            {
                Message.AppendString(this.fUser.GetMotto());        // Motto
                Message.AppendString("");                           // Last Access (N/A)
            }
            else
            {
                Message.AppendString("Offline");                                // Motto ("Offline" in this case)
                Message.AppendString(this.fUser.GetLastAccess().ToString());    // Last Access
            }

            return(Message.GetBytes());
        }
Example #2
0
        public void SendMessage(OutgoingMessage message)
        {
            Core.GetStandardOut().PrintNotice(" [" + mID + "] <-- " + message.Header + message.GetContentString());

            SendData(message.GetBytes());
        }
Example #3
0
        public void ReadLoopbackWorldResponse(XmlNode node)
        {
            // WorldResponse response;
            string        world_id           = null;
            string        update_url         = null;
            string        patcher_url        = null;
            string        hostname           = null;
            int           port               = 0;
            List <string> world_repositories = new List <string>();
            bool          standalone         = false;
            string        startup_script     = null;

            if (node.Attributes["world_id"] == null)
            {
                log.Warn("loopback_world_response element missing world_id attribute");
            }
            else
            {
                world_id = node.Attributes["world_id"].Value;
            }
            LoopbackWorldResponse loopbackWorldResponse = new LoopbackWorldResponse();

            foreach (XmlNode child in node.ChildNodes)
            {
                switch (child.Name)
                {
                case "account":
                    if (child.Attributes["id_token"] != null)
                    {
                        string token = child.Attributes["id_token"].Value;
                        loopbackWorldResponse.idToken = Convert.FromBase64String(token);
                    }
                    else if (child.Attributes["id_number"] != null)
                    {
                        string number = child.Attributes["id_number"].Value;
                        int    id     = int.Parse(number);

                        // Make an old style token for older servers
                        loopbackWorldResponse.oldToken = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(id));

                        // Build a fake token to send to the login server
                        OutgoingMessage tokenBuilder = new OutgoingMessage();
                        tokenBuilder.Write((byte)1);          // version
                        tokenBuilder.Write((byte)1);          // type
                        tokenBuilder.Write("master");         // issuer
                        tokenBuilder.Write(1L);               // token id
                        tokenBuilder.Write(1L);               // key id
                        tokenBuilder.Write(0L);               // expiry
                        tokenBuilder.Write((byte)24);         // TreeMap type
                        tokenBuilder.Write(1);                // num entries
                        tokenBuilder.Write("account_id");     // entry key
                        tokenBuilder.Write((byte)3);          // int type
                        tokenBuilder.Write(id);               // account_id
                        tokenBuilder.Write((byte)0);          // authenticator
                        loopbackWorldResponse.idToken = tokenBuilder.GetBytes();
                    }
                    else
                    {
                        log.Warn("account element missing multiverse_id attribute");
                    }
                    break;

                case "update_url":
                    if (child.Attributes["href"] != null)
                    {
                        update_url = child.Attributes["href"].Value;
                    }
                    else
                    {
                        log.Warn("update_url element missing href attribute");
                    }
                    break;

                case "patcher_url":
                    if (child.Attributes["href"] != null)
                    {
                        patcher_url = child.Attributes["href"].Value;
                    }
                    else
                    {
                        log.Warn("patcher_url element missing href attribute");
                    }
                    break;

                case "server":
                    if (child.Attributes["hostname"] != null)
                    {
                        hostname = child.Attributes["hostname"].Value;
                    }
                    else
                    {
                        log.Warn("server element missing hostname attribute");
                    }
                    if (child.Attributes["port"] != null)
                    {
                        if (!int.TryParse(child.Attributes["port"].Value, out port))
                        {
                            log.Warn("server element has invalid port attribute");
                        }
                    }
                    else
                    {
                        log.Warn("server element missing port attribute");
                    }
                    break;

                case "world_repository":
                    if (child.Attributes["world_id"] != null)
                    {
                        world_repositories.Add(Path.Combine(WorldServerEntry.WorldsFolder, child.Attributes["world_id"].Value));
                    }
                    else if (child.Attributes["path"] != null)
                    {
                        world_repositories.Add(child.Attributes["path"].Value);
                    }
                    else
                    {
                        log.Warn("world_repository element missing world_id or path attribute");
                    }
                    break;

                case "standalone":
                    if (child.Attributes["script"] != null)
                    {
                        standalone     = true;
                        startup_script = child.Attributes["script"].Value;
                    }
                    else
                    {
                        log.Warn("standalone element missing script attribute");
                    }
                    break;
                }
            }
            loopbackWorldResponse.worldServerEntry = new WorldServerEntry(world_id, hostname, port, patcher_url, update_url);
            loopbackWorldResponse.worldServerEntry.WorldRepositoryDirectories = world_repositories;
            loopbackWorldResponse.worldServerEntry.Standalone    = standalone;
            loopbackWorldResponse.worldServerEntry.StartupScript = startup_script;
            worldServerEntries.Add(loopbackWorldResponse);
        }