From 94ffa8784dd2fa12083caf7b0ce9c041f70686c2 Mon Sep 17 00:00:00 2001 From: rasmus Date: Sun, 4 May 2025 18:49:04 +0200 Subject: [PATCH] Made program actually ussable --- .gitignore | 1 + include/WordUtils.h | 4 +- src/ServerUtils.cpp | 28 ++++++-------- src/WordUtils.cpp | 91 ++++++++++++++++++++++++++++++++++++++++----- src/main.cpp | 14 +++---- 5 files changed, 103 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 29fd721..ab57ace 100644 --- a/.gitignore +++ b/.gitignore @@ -89,3 +89,4 @@ dkms.conf # Misc *.txt CMakeFiles/ +build/ diff --git a/include/WordUtils.h b/include/WordUtils.h index 6d6e0c1..5048904 100644 --- a/include/WordUtils.h +++ b/include/WordUtils.h @@ -11,10 +11,12 @@ using namespace std; struct WordUtils { static map> load_data(const char *path); - static vector predictNextWord(const string& input, const map>& model, size_t count); + static vector predict_next_word(const string& input, const map>& word_frequencies, size_t count); static string load_file(const char *path); static vector split_string(const string& input, const char *delimiters); static string extract_url(const string& input); + static vector create_tag(const map>& word_frequencies, unsigned int hash); + static unsigned int hash_url(const string& input); }; #endif \ No newline at end of file diff --git a/src/ServerUtils.cpp b/src/ServerUtils.cpp index 9d1abb5..c08ab4a 100644 --- a/src/ServerUtils.cpp +++ b/src/ServerUtils.cpp @@ -13,7 +13,7 @@ using namespace std; -void ServerUtils::serve(map> wordwordFrequencies) { +void ServerUtils::serve(map> word_frequencies) { // server_fd is a file descriptor. int server_fd = socket(AF_INET, SOCK_STREAM, 0); @@ -23,36 +23,36 @@ void ServerUtils::serve(map> wordwordFrequencies) { addr.sin_addr.s_addr = INADDR_ANY; bind(server_fd, (sockaddr*)&addr, sizeof(addr)); - listen(server_fd, 5); + listen(server_fd, 15); cout << "Server is running on http://localhost:8888 \n"; while (true) { int client_fd = accept(server_fd, nullptr, nullptr); - thread(process_request, client_fd, wordwordFrequencies).detach(); + thread(process_request, client_fd, word_frequencies).detach(); } close(server_fd); } -void ServerUtils::process_request(int client_fd, map> wordwordFrequencies) { +void ServerUtils::process_request(int client_fd, map> word_frequencies) { char buffer[1024]; int bytes_received = recv(client_fd, buffer, sizeof(buffer) - 1, 0); + string url; + if (bytes_received > 0) { buffer[bytes_received] = '\0'; - string temp = WordUtils::extract_url(string(buffer)); - - cerr << temp << endl; - - + url = WordUtils::extract_url(string(buffer)); } else { cerr << "AAAA \n"; } + + unsigned int hash = WordUtils::hash_url(url); string headers = "HTTP/1.1 200 OK\r\n" @@ -62,13 +62,7 @@ void ServerUtils::process_request(int client_fd, map> w send(client_fd, headers.c_str(), headers.size(), 0); - const string html_chunks[] = { - "\nDrip\n", - "

Hello

\n", - "

This is a test

\n", - "

Drip feed complete!

\n", - "\n" - }; + const vector html_chunks = WordUtils::create_tag(word_frequencies, hash); for (const auto& chunk : html_chunks) { ostringstream oss; @@ -76,7 +70,7 @@ void ServerUtils::process_request(int client_fd, map> w string to_send = oss.str(); send(client_fd, to_send.c_str(), to_send.size(), 0); - this_thread::sleep_for(chrono::seconds(1)); + this_thread::sleep_for(chrono::milliseconds(5)); } // Send final zero-length chunk to end the response diff --git a/src/WordUtils.cpp b/src/WordUtils.cpp index 36ac301..ba29a53 100644 --- a/src/WordUtils.cpp +++ b/src/WordUtils.cpp @@ -3,6 +3,10 @@ #include "../include/WordUtils.h" #include #include +#include +#include +#include +#include map> WordUtils::load_data(const char *path) { const char del[] = {' ', '.', ',', '!', '?', ';', ':', '(', ')', '\n', '\r', '\t'}; @@ -12,22 +16,18 @@ map> WordUtils::load_data(const char *path) { map> word_frequencies = {}; for (long unsigned int i = 0; i + 1 < data.size(); i++) { + transform(data[i].begin(), data[i].end(), data[i].begin(), [](unsigned char c){ return tolower(c); }); + transform(data[i+1].begin(), data[i+1].end(), data[i+1].begin(), [](unsigned char c){ return tolower(c); }); word_frequencies[data[i]][data[i+1]]++; } - - - vector>> test; - - - return word_frequencies; } -vector WordUtils::predictNextWord(const string& input, const map>& model, size_t count) { - auto it = model.find(input); +vector WordUtils::predict_next_word(const string& input, const map>& word_frequencies, size_t count) { + auto it = word_frequencies.find(input); - if (it == model.end()) return {"(no prediction)"}; + if (it == word_frequencies.end()) return {input}; const map nextWords = it->second; @@ -48,6 +48,69 @@ vector WordUtils::predictNextWord(const string& input, const map WordUtils::create_tag(const map>& word_frequencies, unsigned int hash) { + const vector beginning_sequences = {"the", "but", "with"}; + const string start = "\nDrip\n"; + const string end = "\n"; + vector tags; + + const string hashes = to_string(hash); + + tags.push_back(start); + + int predict_num = 5; + + // Tags + for (int i = 0; i < hashes.size(); i++) + { + vector inner_tags; + + minstd_rand generator((int)hashes[i]); + + uniform_int_distribution outer_distribution(0, beginning_sequences.size() - 1); + vector temp_words = predict_next_word(beginning_sequences[outer_distribution(generator)], word_frequencies, predict_num); + + uniform_int_distribution outer_2_distribution(0, temp_words.size() - 1); + + inner_tags.push_back(temp_words[outer_2_distribution(generator)]); + + // Words per tag + for (int j = 0; j < 25; j++) + { + temp_words = predict_next_word(inner_tags[j], word_frequencies, predict_num); + + uniform_int_distribution inner_distribution(0, temp_words.size() - 1); + + if (temp_words.size() != 0) + { + temp_words = predict_next_word(inner_tags[j], word_frequencies, predict_num); + + uniform_int_distribution inner_2_distribution(0, temp_words.size() - 1); + + inner_tags.push_back(temp_words[inner_2_distribution(generator)]); + } else { + temp_words = predict_next_word(beginning_sequences[outer_distribution(generator)], word_frequencies, predict_num); + + uniform_int_distribution inner_3_distribution(0, temp_words.size() - 1); + + inner_tags.push_back(temp_words[inner_3_distribution(generator)]); + } + } + + string temp_string = "

"; + for (int l = 0; l < inner_tags.size(); l++) + { + temp_string += inner_tags[l] + " "; + } + + temp_string += ".

"; + + tags.push_back(temp_string); + } + + + return tags; +} vector WordUtils::split_string(const string& input, const char *delimiters) { vector data; @@ -56,7 +119,7 @@ vector WordUtils::split_string(const string& input, const char *delimite size_t end = 0; // Create a string from the delimiters array - string delimiter_string(delimiters); + string delimiter_string = " .,!?;:()\n\r\t"; while ((end = input.find_first_of(delimiter_string, start)) != string::npos) { if (end > start) { @@ -101,4 +164,12 @@ string WordUtils::extract_url(const string& input) { if (path_end == string::npos) return ""; return first_line.substr(method_end + 1, path_end - method_end - 1); +} + +unsigned int WordUtils::hash_url(const string& input) { + unsigned int hash = 0; + for (char c : input) { + hash += static_cast(c); + } + return hash; } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 4d0db54..5ec161e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,7 +5,7 @@ using namespace std; int main(int argc, char* argv[]) { - if (argc > 2) + /*if (argc > 2) { cout << "Too many arguments"; return 0; @@ -15,10 +15,10 @@ int main(int argc, char* argv[]) { { cout << "Filepath: " << argv[1] << " doesn't exist."; return 0; - } + }*/ - auto lol = WordUtils::load_data(argv[1]); + /*auto lol = WordUtils::load_data("/home/skingging/Documents/Projects/CPP/AI-Tarpit-Reimagined/wordlist/wordlist-Food.txt"); string word; while (true) @@ -26,17 +26,17 @@ int main(int argc, char* argv[]) { cout << "Please input word: \n"; cin >> word; - vector words = WordUtils::predictNextWord(word, lol, 10); + vector words = WordUtils::predict_next_word(word, lol, 10); for (const auto& out : words) { cout << "Next word is: " << out << endl; } - } + }*/ - - //ServerUtils::serve(WordUtils::load_data(argv[1])); + //argv[1] + ServerUtils::serve(WordUtils::load_data("/home/skingging/Documents/Projects/CPP/AI-Tarpit-Reimagined/wordlist/wordlist-Food.txt")); return 0; } \ No newline at end of file