ChatObject ParseWith(JArray with, ChatObject chatObj) {
            for (int x = 0; x < with.Count; x++) {
                switch (with[x].Type) {
                    case JTokenType.String: // -- Add a name
                        if (chatObj.translate == "chat.type.text")
                            chatObj.text += (string)((JValue)with[x]).Value;
                        else
                            chatObj.Names.Add((string)((JValue)with[x]).Value);
                            
                        break;
                    case JTokenType.Object:
                        var myObj = (JObject)with[x];
                        chatObj = ParseSecondaryElement(myObj, chatObj);
                        break;
                }
            }

            return chatObj;
        }
        ChatObject DoExtra(ChatObject chatObj, JObject myObj) {
            foreach (JProperty prop in myObj.Children()) {
                switch (prop.Name) {
                    case "color":
                        chatObj.text += Color_To_Code((string)prop.Value);
                        break;
                    case "text":
                        chatObj.text += (string)prop.Value;
                        break;
                }
            }

            return chatObj;
        }
        string ParseModifiers(ChatObject MainObj, string Text) {
            if (MainObj.italic)
                Text += "§o";

            if (MainObj.bold)
                Text += "§l";

            if (MainObj.strikethrough)
                Text += "§m";

            if (MainObj.obfs)
                Text += "§k";

            if (MainObj.color != null)
                Text += Color_To_Code(MainObj.color);

            return Text;
        }
        ChatObject ParseSecondaryElement(JObject jsonObj, ChatObject chatObj) {
            foreach (JProperty prop in jsonObj.Properties()) {
                switch (prop.Name) {
                    case "translate":
                        chatObj.translate = (string)((JValue)prop.Value);
                        break;
                    case "with":
                        chatObj.Names.Add((string)((JValue)((JArray)prop.Value)[0]).Value);
                        break;
                    case "text":
                        chatObj.Names.Add((string)((JValue)prop.Value));
                        break;
                    case "extra":
                        foreach (JValue b in (JArray)prop.Value) {
                            if (b.Type == JTokenType.String)
                                chatObj.text += (string)b.Value + " ";
                        }
                        break;
                }
            }

            return chatObj;
        }
        ChatObject ParseElement(JObject jsonObj) {
            var chat = new ChatObject();

            foreach (JProperty prop in jsonObj.Properties()) {
                switch (prop.Name) {
                    case "translate":
                        chat.translate = (string)prop.Value;
                        break;
                    case "italic":
                        chat.italic = (bool)prop.Value;
                        break;
                    case "color":
                        chat.color = (string)prop.Value;
                        break;
                    case "text":
                        chat.text = (string)prop.Value;
                        break;
                    case "with":
                        chat.with = (JArray)prop.Value;
                        break;
                    default:
                        chat.unknown = prop.Name;
                        break;
                }
            }

            return chat;
        }
        ChatObject ParseWith(IEnumerable<JToken> with, ChatObject chatObj)
        {
            foreach (JToken token in with)
            {
                switch (token.Type) {
                    case JTokenType.String: // -- Add a name
                        if (chatObj.Translate == "chat.type.text")
                            chatObj.Text += (string)((JValue)token).Value;
                        else
                            chatObj.Names.Add((string)((JValue)token).Value);
                            
                        break;
                    case JTokenType.Object:
                        var myObj = (JObject)token;
                        chatObj = ParseSecondaryElement(myObj, chatObj);
                        break;
                }
            }

            return chatObj;
        }
        string ParseModifiers(ChatObject mainObj, string text) {
            if (mainObj.Italic)
                text += "§o";

            if (mainObj.Bold)
                text += "§l";

            if (mainObj.Strikethrough)
                text += "§m";

            if (mainObj.Obfs)
                text += "§k";

            if (mainObj.Color != null)
                text += Color_To_Code(mainObj.Color);

            return text;
        }