/* OneLoneCoder.com - Program a Logitech Keyboard To Display Twitch Chat "Put Your Money Where Your Mouth Is" - @Javidx9 Disclaimer ~~~~~~~~~~ I don't care what you use this for. It's intended to be educational, and perhaps to the oddly minded - a little bit of fun. Please hack this, change it and use it in any way you see fit. BUT, you acknowledge that I am not responsible for anything bad that happens as a result of your actions. However, if good stuff happens, I would appreciate a shout out, or at least give the blog some publicity for me. Cheers! Background ~~~~~~~~~~ A very minimal example of using the Logitech SDK to interface with a keyboard display, then uses a really sloppy implementation of sockets, to connect to a twitch chat session, displaying the chat on the keybaord screen. Future Modifications ~~~~~~~~~~~~~~~~~~~~ 1) Wrap around text display on screen Author ~~~~~~ Twitter: @javidx9 Blog: www.onelonecoder.com Video: ~~~~~~ https://youtu.be/8UXCo-GhiF0 Last Updated: 23/05/2017 */ #include #include using namespace std; // Include Winsock #include #include // Include Logitech library #include "LogitechLCDLib.h" int main() { // Load the driver LogiLcdInit(L"OneLoneCoder Test", LOGI_LCD_TYPE_MONO); // Check hardware is connected if (!LogiLcdIsConnected(LOGI_LCD_TYPE_MONO)) wcout << "Hardware not found" << endl; // Load WinSock WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) wcout << "Could not start WinSock" << endl; // Get address to twitch server struct addrinfo *addr = nullptr; if (getaddrinfo("irc.chat.twitch.tv", "6667", nullptr, &addr) != 0) wcout << "Failed to get address info" << endl; // Create socket SOCKET sock = INVALID_SOCKET; sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); // Connect to server via socket int i = connect(sock, addr->ai_addr, (int)addr->ai_addrlen); if (i != SOCKET_ERROR) { // Handshake with twitch string s; // Authenticate s = "PASS oauth:###INSERT YOUR OAUTH HERE###\r\n"; send(sock, s.c_str(), s.length(), 0); // Register your twitch name s = "NICK javidx9\r\n"; send(sock, s.c_str(), s.length(), 0); // Join a twitch chat s = "JOIN #javidx9\r\n"; send(sock, s.c_str(), s.length(), 0); } char buffer[100]; string s; list sLines = { "","","","" }; while (1) { // Get Twitch Server Message int i = recv(sock, buffer, 100, 0); for (int j = 0; j < i; j++) { s.append(1, buffer[j]); if (buffer[j] == '\n') { // User name is between first ':' and '!'. // User chat is after second ':' size_t m = s.find('!'); string sUserName = s.substr(1, m - 1); size_t n = s.find(':', m); if (n != string::npos) { string chat = s.substr(n + 1); cout << sUserName.c_str() << ": " << chat.c_str() << endl; sLines.pop_front(); sLines.push_back(sUserName + ": " + chat); } s.clear(); } } // Display 4 lines of text from list int p = 0; for (auto k : sLines) { wstring ws; ws.assign(k.begin(), k.end()); LogiLcdMonoSetText(p, (wchar_t*)ws.c_str()); // yuck... p++; } // Update display LogiLcdUpdate(); } LogiLcdShutdown(); return 0; }