/* OneLoneCoder.com - Program a Logitech Keyboard To Display Twitch Chat "Put Your Money Where Your Mouth Is" - @Javidx9 License ~~~~~~~ Copyright (C) 2018 Javidx9 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions; See license for details. Original works located at: https://www.github.com/onelonecoder https://www.onelonecoder.com https://www.youtube.com/javidx9 GNU GPLv3 https://github.com/OneLoneCoder/videos/blob/master/LICENSE From Javidx9 :) ~~~~~~~~~~~~~~~ Hello! Ultimately 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. You acknowledge that I am not responsible for anything bad that happens as a result of your actions. However this code is protected by GNU GPLv3, see the license in the github repo. This means you must attribute me if you use it. You can view this license here: https://github.com/OneLoneCoder/videos/blob/master/LICENSE 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; }