summaryrefslogblamecommitdiffstats
path: root/src/Chat.cpp
blob: 6870a83e144775f9c8267c1f1247aa0a94173902 (plain) (tree)
1
2
3
4
5
6


                            
 
                     
 
























































































                                                                                                         
 
 





























                                                                             
 




                                             


                                  

                  
#include "Chat.hpp"

#include <nlohmann/json.hpp>

using nlohmann::json;

Component RecurParseComponent(json j) {
	Component component;
	if (j.is_string()) {
		component.type = Component::STRING;
		component.text = j.get<std::string>();
		return component;
	}

	if (j.find("text") != j.end()) {
		component.type = Component::STRING;
		component.text = j["text"].get<std::string>();
	}
	else if (j.find("translate") != j.end()) {
		component.type = Component::TRANSLATION;
		component.translate = j["translate"].get<std::string>();
		for (auto& it : j["with"]) {
			component.with.push_back(RecurParseComponent(it));
		}
	}
	else if (j.find("keybind") != j.end()) {

	}
	else if (j.find("score") != j.end()) {

	}
	else if (j.find("selector") != j.end()) {

	}

	if (j.find("bold") != j.end())
		component.isBold = j["bold"].get<bool>();
	if (j.find("italic") != j.end())
		component.isItalic = j["italic"].get<bool>();
	if (j.find("underlined") != j.end())
		component.isUnderlined = j["underlined"].get<bool>();
	if (j.find("strikethrough") != j.end())
		component.isStrikethrough = j["strikethrough"].get<bool>();
	if (j.find("obfuscated") != j.end())
		component.isObfuscated = j["obfuscated"].get<bool>();
	if (j.find("color") != j.end())
		component.color = j["color"].get<std::string>();
	if (j.find("insertion") != j.end())
		component.insertion = j["insertion"].get<std::string>();

	if (j.find("clickEvent") != j.end()) {
		component.clickEvent.value = j["clickEvent"]["value"].get<std::string>();

		if (j["clickEvent"]["action"] == "open_url")
			component.clickEvent.action = ClickEvent::OPEN_URL;
		else if (j["clickEvent"]["action"] == "open_file")
			component.clickEvent.action = ClickEvent::OPEN_FILE;
		else if (j["clickEvent"]["action"] == "run_command")
			component.clickEvent.action = ClickEvent::RUN_COMMAND;
		else if (j["clickEvent"]["action"] == "suggest_command")
			component.clickEvent.action = ClickEvent::SUGGEST_COMMAND;
		else if (j["clickEvent"]["action"] == "change_page")
			component.clickEvent.action = ClickEvent::CHANGE_PAGE;
	}

	if (j.find("hoverEvent") != j.end()) {
		if (j["hoverEvent"]["value"].is_string())
			component.hoverEvent.value = j["hoverEvent"]["value"].get<std::string>();
		else
			component.hoverEvent.value = j["hoverEvent"]["value"]["text"].get<std::string>();

		if (j["hoverEvent"]["action"] == "show_text")
			component.hoverEvent.action = HoverEvent::SHOW_TEXT;
		else if (j["hoverEvent"]["action"] == "show_item")
			component.hoverEvent.action = HoverEvent::SHOW_ITEM;
		else if (j["hoverEvent"]["action"] == "show_entity")
			component.hoverEvent.action = HoverEvent::SHOW_ENTITY;
		else if (j["hoverEvent"]["action"] == "show_achievement")
			component.hoverEvent.action = HoverEvent::SHOW_ACHIEVEMENT;
	}

	if (j.find("extra") != j.end()) {
		for (auto& it : j["extra"]) {
			component.extra.push_back(RecurParseComponent(it));
		}
	}

	return component;
}

Chat::Chat(const std::string &json) {
	static const size_t s = sizeof(Component);
	nlohmann::json j = nlohmann::json::parse(json);
	volatile size_t f = s + 1;
	component = RecurParseComponent(j);
}

void RecurPlainTextAppend(const Component& component, std::string& str) {
	switch (component.type) {
	case Component::STRING:
		str += component.text;
		break;
	case Component::TRANSLATION:
		if (component.translate == "chat.type.text") {
			str += "<";
			RecurPlainTextAppend(component.with[0], str);
			str += "> ";
			for (int i = 1; i < component.with.size(); i++)
				RecurPlainTextAppend(component.with[i], str);
		} else {
			str += component.translate;
			str += "{";
			for (auto& it : component.with) {
				RecurPlainTextAppend(it, str);
				str += ";";
			}
			str += "}";
		}
		break;
	default:
		break;
	}

	for (auto& it : component.extra) {
		RecurPlainTextAppend(it, str);
	}
}

std::string Chat::ToPlainText() const
{
	std::string ret;
	RecurPlainTextAppend(component, ret);
	return ret;
}

std::string Chat::ToJson() const {
	return "";
}