diff --git a/src/main.ino b/src/main.ino index fe2d159..a1e54fa 100644 --- a/src/main.ino +++ b/src/main.ino @@ -293,50 +293,51 @@ void displayLines() { tft.print(kicker); cursorY += CHAR_HEIGHT; } else if (line.startsWith("MODE ")) { - tft.setTextColor(TFT_BLUE); + tft.setTextColor(TFT_YELLOW); tft.print("MODE "); String modeChange = line.substring(5); tft.setTextColor(TFT_WHITE); tft.print(modeChange); cursorY += CHAR_HEIGHT; - } else if (line.startsWith("* ")) { // Check for action message - int spacePos = line.indexOf(' ', 2); - String senderNick = line.substring(2, spacePos); - String actionMessage = line.substring(spacePos + 1); - - tft.setTextColor(TFT_WHITE); + } else if (line.startsWith("ERROR ")) { + tft.setTextColor(TFT_RED); + tft.print("ERROR "); + String errorReason = line.substring(6); + tft.setTextColor(TFT_DARKGREY); + tft.print(errorReason); + cursorY += CHAR_HEIGHT; + } else if (line.startsWith("* ")) { + tft.setTextColor(TFT_MAGENTA); tft.print("* "); + int startIndex = 2; + int endIndex = line.indexOf(' ', startIndex); + String senderNick = line.substring(startIndex, endIndex); + String actionMessage = line.substring(endIndex + 1); tft.setTextColor(nickColors[senderNick]); - tft.print(senderNick + " "); - tft.setTextColor(TFT_WHITE); - tft.print(actionMessage); - + tft.print(senderNick); + tft.setTextColor(TFT_MAGENTA); + tft.print(" " + actionMessage); cursorY += CHAR_HEIGHT; } else { - int colonPos = line.indexOf(':'); - String senderNick = line.substring(0, colonPos); - String message = line.substring(colonPos + 2); + int colonIndex = line.indexOf(':'); + String senderNick = line.substring(0, colonIndex); + String message = line.substring(colonIndex + 1); - tft.setTextColor(nickColors[senderNick]); - tft.print(senderNick + ": "); - tft.setTextColor(TFT_WHITE); - - // Check if the message contains the nick and highlight it - int nickPos = message.indexOf(nick); - if (mention && nickPos != -1) { - cursorY = renderFormattedMessage(message, cursorY, CHAR_HEIGHT, true); + if (mention) { + tft.setTextColor(TFT_YELLOW, TFT_RED); } else { - cursorY = renderFormattedMessage(message, cursorY, CHAR_HEIGHT, false); + tft.setTextColor(nickColors[senderNick]); } + tft.print(senderNick); + tft.setTextColor(TFT_WHITE); + tft.print(":" + message); + cursorY += CHAR_HEIGHT; } } - - displayInputLine(); } - -void addLine(String senderNick, String message, String type, bool mention = false) { - if (nickColors.find(senderNick) == nickColors.end()) +void addLine(String senderNick, String message, String type, uint16_t errorColor = TFT_WHITE, uint16_t reasonColor = TFT_WHITE) { + if (type != "error" && nickColors.find(senderNick) == nickColors.end()) nickColors[senderNick] = generateRandomColor(); String formattedMessage; @@ -360,6 +361,9 @@ void addLine(String senderNick, String message, String type, bool mention = fals formattedMessage = "MODE " + message; } else if (type == "action") { formattedMessage = "* " + senderNick + " " + message; + } else if (type == "error") { + formattedMessage = "ERROR " + message; + senderNick = "ERROR"; // Use ERROR as senderNick to highlight it in red } else { formattedMessage = senderNick + ": " + message; } @@ -371,13 +375,17 @@ void addLine(String senderNick, String message, String type, bool mention = fals mentions.erase(mentions.begin()); } - lines.push_back(formattedMessage); - mentions.push_back(mention); + if (type == "error") { + lines.push_back("ERROR " + message); + mentions.push_back(false); + } else { + lines.push_back(formattedMessage); + mentions.push_back(false); + } displayLines(); } - void displayDeviceInfo() { tft.fillScreen(TFT_BLACK); printDeviceInfo(); @@ -528,7 +536,6 @@ void parseAndDisplay(String line) { String senderNick = line.substring(1, line.indexOf('!')); bool mention = message.indexOf(nick) != -1; - // This doesn't work for some annoying reason... even with \001 if (message.startsWith("\x01ACTION ") && message.endsWith("\x01")) { String actionMessage = message.substring(8, message.length() - 1); addLine(senderNick, actionMessage, "action"); @@ -546,9 +553,19 @@ void parseAndDisplay(String line) { String senderNick = line.substring(1, line.indexOf('!')); addLine(senderNick, "", "quit"); } else if (command == "NICK") { - String oldNick = line.substring(1, line.indexOf('!')); + String prefix = line.startsWith(":") ? line.substring(1, firstSpace) : ""; String newNick = line.substring(line.lastIndexOf(':') + 1); - addLine(oldNick, " -> " + newNick, "nick"); + + if (prefix == "") { // Our own NICK changes + addLine(nick, " -> " + newNick, "nick"); + nick = newNick; + } else { // Other peoples NICK change + String oldNick = prefix.substring(0, prefix.indexOf('!')); + if (oldNick == nick) { + nick = newNick; // Update global nick when we get confirmation + } + addLine(oldNick, " -> " + newNick, "nick"); + } } else if (command == "KICK") { int thirdSpace = line.indexOf(' ', secondSpace + 1); int fourthSpace = line.indexOf(' ', thirdSpace + 1); @@ -558,6 +575,10 @@ void parseAndDisplay(String line) { } else if (command == "MODE") { String modeChange = line.substring(secondSpace + 1); addLine("", modeChange, "mode"); + } else if (command == "432") { // ERR_ERRONEUSNICKNAME + addLine("ERROR", "ERR_ERRONEUSNICKNAME", "error", TFT_RED, TFT_DARKGREY); + } else if (command == "433") { // ERR_NICKNAMEINUSE + addLine("ERROR", "ERR_NICKNAMEINUSE", "error", TFT_RED, TFT_DARKGREY); } } } @@ -566,7 +587,12 @@ void parseAndDisplay(String line) { void handleKeyboardInput(char key) { if (key == '\n' || key == '\r') { // Enter - if (inputBuffer.startsWith("/debug")) { + if (inputBuffer.startsWith("/nick ")) { + String newNick = inputBuffer.substring(6); + sendIRC("NICK " + newNick); + inputBuffer = ""; + displayInputLine(); + } else if (inputBuffer.startsWith("/debug")) { debugMode = true; debugStartTime = millis(); displayDeviceInfo(); @@ -585,30 +611,29 @@ void handleKeyboardInput(char key) { } inputBuffer = ""; displayInputLine(); - lastActivityTime = millis(); // Reset activity timer + lastActivityTime = millis(); if (!screenOn) { - turnOnScreen(); // Turn on screen and backlight + turnOnScreen(); } } else if (key == '\b') { // Backspace if (inputBuffer.length() > 0) { inputBuffer.remove(inputBuffer.length() - 1); displayInputLine(); - lastActivityTime = millis(); // Reset activity timer + lastActivityTime = millis(); if (!screenOn) { - turnOnScreen(); // Turn on screen and backlight + turnOnScreen(); } } } else { inputBuffer += key; displayInputLine(); - lastActivityTime = millis(); // Reset activity timer + lastActivityTime = millis(); if (!screenOn) { - turnOnScreen(); // Turn on screen and backlight + turnOnScreen(); } } } - void sendRawCommand(String command) { if (client.connected()) { sendIRC(command); @@ -624,8 +649,6 @@ char getKeyboardInput() { if (Wire.available()) { incoming = Wire.read(); if (incoming != (char)0x00) { - Serial.print("Key: "); - Serial.println(incoming); return incoming; } }