diff options
| author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2016-03-17 14:37:47 -0400 |
|---|---|---|
| committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2016-03-17 14:37:47 -0400 |
| commit | 1b78c44442cd578bad394bf6cbfabd4af637ca4b (patch) | |
| tree | da3b4fa5b486515620518918cc13139389048e4b | |
| parent | be38bfeda5b4970b22454ec60f26c326395818ae (diff) | |
| download | nancy-1b78c44442cd578bad394bf6cbfabd4af637ca4b.tar.gz nancy-1b78c44442cd578bad394bf6cbfabd4af637ca4b.tar.bz2 nancy-1b78c44442cd578bad394bf6cbfabd4af637ca4b.zip | |
Updated to use verbly
| -rw-r--r-- | .gitmodules | 3 | ||||
| -rw-r--r-- | CMakeLists.txt | 14 | ||||
| -rw-r--r-- | cmake/modules/FindMysql.cmake | 78 | ||||
| -rw-r--r-- | nancy.cpp | 88 | ||||
| m--------- | vendor/verbly | 0 |
5 files changed, 45 insertions, 138 deletions
| diff --git a/.gitmodules b/.gitmodules index 581c545..253a6d8 100644 --- a/.gitmodules +++ b/.gitmodules | |||
| @@ -4,3 +4,6 @@ | |||
| 4 | [submodule "vendor/yaml-cpp"] | 4 | [submodule "vendor/yaml-cpp"] |
| 5 | path = vendor/yaml-cpp | 5 | path = vendor/yaml-cpp |
| 6 | url = https://github.com/jbeder/yaml-cpp | 6 | url = https://github.com/jbeder/yaml-cpp |
| 7 | [submodule "vendor/verbly"] | ||
| 8 | path = vendor/verbly | ||
| 9 | url = https://github.com/hatkirby/verbly | ||
| diff --git a/CMakeLists.txt b/CMakeLists.txt index 554735d..d57c96a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt | |||
| @@ -4,16 +4,14 @@ project (nancy) | |||
| 4 | set(CMAKE_BUILD_TYPE Debug) | 4 | set(CMAKE_BUILD_TYPE Debug) |
| 5 | 5 | ||
| 6 | add_subdirectory(vendor/twitcurl/libtwitcurl) | 6 | add_subdirectory(vendor/twitcurl/libtwitcurl) |
| 7 | 7 | add_subdirectory(vendor/verbly) | |
| 8 | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/") | ||
| 9 | |||
| 10 | find_package(Mysql REQUIRED) | ||
| 11 | |||
| 12 | add_subdirectory(vendor/yaml-cpp EXCLUDE_FROM_ALL) | 8 | add_subdirectory(vendor/yaml-cpp EXCLUDE_FROM_ALL) |
| 13 | include_directories(vendor/yaml-cpp/include) | ||
| 14 | 9 | ||
| 15 | include_directories(vendor/twitcurl/libtwitcurl ${MYSQL_INCLUDE_DIR}) | 10 | find_package(PkgConfig) |
| 11 | pkg_check_modules(sqlite3 sqlite3 REQUIRED) | ||
| 12 | |||
| 13 | include_directories(vendor/yaml-cpp/include vendor/twitcurl/libtwitcurl vendor/verbly/lib) | ||
| 16 | add_executable(nancy nancy.cpp) | 14 | add_executable(nancy nancy.cpp) |
| 17 | set_property(TARGET nancy PROPERTY CXX_STANDARD 11) | 15 | set_property(TARGET nancy PROPERTY CXX_STANDARD 11) |
| 18 | set_property(TARGET nancy PROPERTY CXX_STANDARD_REQUIRED ON) | 16 | set_property(TARGET nancy PROPERTY CXX_STANDARD_REQUIRED ON) |
| 19 | target_link_libraries(nancy yaml-cpp ${MYSQL_LIBRARIES} twitcurl curl) | 17 | target_link_libraries(nancy yaml-cpp twitcurl curl verbly ${sqlite3_LIBRARIES}) |
| diff --git a/cmake/modules/FindMysql.cmake b/cmake/modules/FindMysql.cmake deleted file mode 100644 index e060e49..0000000 --- a/cmake/modules/FindMysql.cmake +++ /dev/null | |||
| @@ -1,78 +0,0 @@ | |||
| 1 | # This line added for distribution with Vermont: | ||
| 2 | MESSAGE(STATUS "Using bundled FindMySQL.cmake...") | ||
| 3 | |||
| 4 | # - Find MySQL | ||
| 5 | # Find the MySQL includes and client library | ||
| 6 | # This module defines | ||
| 7 | # MYSQL_INCLUDE_DIR, where to find mysql.h | ||
| 8 | # MYSQL_LIBRARIES, the libraries needed to use MySQL. | ||
| 9 | # MYSQL_FOUND, If false, do not try to use MySQL. | ||
| 10 | # | ||
| 11 | # Copyright (c) 2006, Jaroslaw Staniek, <js@iidea.pl> | ||
| 12 | # | ||
| 13 | # Redistribution and use is allowed according to the terms of the BSD license. | ||
| 14 | # For details see the accompanying COPYING-CMAKE-SCRIPTS file. | ||
| 15 | |||
| 16 | |||
| 17 | IF(UNIX) | ||
| 18 | SET(MYSQL_CONFIG_PREFER_PATH "$ENV{MYSQL_HOME}/bin" CACHE FILEPATH | ||
| 19 | "preferred path to MySQL (mysql_config)") | ||
| 20 | FIND_PROGRAM(MYSQL_CONFIG mysql_config | ||
| 21 | ${MYSQL_CONFIG_PREFER_PATH} | ||
| 22 | /usr/local/mysql/bin/ | ||
| 23 | /usr/local/bin/ | ||
| 24 | /usr/bin/ | ||
| 25 | ) | ||
| 26 | |||
| 27 | IF (MYSQL_CONFIG) | ||
| 28 | # set INCLUDE_DIR | ||
| 29 | EXEC_PROGRAM(${MYSQL_CONFIG} | ||
| 30 | ARGS --include | ||
| 31 | OUTPUT_VARIABLE MY_TMP) | ||
| 32 | string (REGEX REPLACE "-I([^ ]*)( .*)?" "\\1" MY_TMP "${MY_TMP}") | ||
| 33 | SET(MYSQL_ADD_INCLUDE_DIR ${MY_TMP} CACHE FILEPATH INTERNAL) | ||
| 34 | |||
| 35 | # set LIBRARY_DIR | ||
| 36 | EXEC_PROGRAM(${MYSQL_CONFIG} | ||
| 37 | ARGS --libs | ||
| 38 | OUTPUT_VARIABLE MY_TMP) | ||
| 39 | string (REGEX REPLACE "(.* )?-L([^ ]*)( .*)?" "\\2" MY_TMP "${MY_TMP}") | ||
| 40 | SET(MYSQL_ADD_LIBRARY ${MY_TMP} CACHE FILEPATH INTERNAL) | ||
| 41 | ENDIF(MYSQL_CONFIG) | ||
| 42 | |||
| 43 | ELSE(UNIX) | ||
| 44 | set(MYSQL_ADD_INCLUDE_DIR "c:/msys/local/include" CACHE FILEPATH INTERNAL) | ||
| 45 | set(MYSQL_ADD_LIBRARY "c:/msys/local/lib" CACHE FILEPATH INTERNAL) | ||
| 46 | ENDIF(UNIX) | ||
| 47 | |||
| 48 | if (NOT MYSQL_FOUND) | ||
| 49 | |||
| 50 | find_path(MYSQL_INCLUDE_DIR mysql.h | ||
| 51 | /usr/local/include | ||
| 52 | /usr/local/include/mysql | ||
| 53 | /usr/local/mysql/include | ||
| 54 | /usr/include | ||
| 55 | ${MYSQL_ADD_INCLUDE_DIR} | ||
| 56 | ) | ||
| 57 | |||
| 58 | find_library(MYSQL_LIBRARIES NAMES mysqlclient | ||
| 59 | PATHS | ||
| 60 | /usr/lib | ||
| 61 | /usr/lib/mysql | ||
| 62 | /usr/local/lib | ||
| 63 | /usr/local/lib/mysql | ||
| 64 | /usr/local/mysql/lib | ||
| 65 | ${MYSQL_ADD_LIBRARY} | ||
| 66 | ) | ||
| 67 | |||
| 68 | if(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES) | ||
| 69 | set(MYSQL_FOUND TRUE CACHE INTERNAL "MySQL found") | ||
| 70 | message(STATUS "Found MySQL: ${MYSQL_INCLUDE_DIR}, ${MYSQL_LIBRARIES}") | ||
| 71 | else(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES) | ||
| 72 | set(MYSQL_FOUND FALSE CACHE INTERNAL "MySQL found") | ||
| 73 | message(STATUS "MySQL not found.") | ||
| 74 | endif(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES) | ||
| 75 | |||
| 76 | mark_as_advanced(MYSQL_INCLUDE_DIR MYSQL_LIBRARIES) | ||
| 77 | |||
| 78 | endif (NOT MYSQL_FOUND) \ No newline at end of file | ||
| diff --git a/nancy.cpp b/nancy.cpp index 3605f71..00c68c5 100644 --- a/nancy.cpp +++ b/nancy.cpp | |||
| @@ -1,16 +1,34 @@ | |||
| 1 | #include <yaml-cpp/yaml.h> | 1 | #include <yaml-cpp/yaml.h> |
| 2 | #include <iostream> | 2 | #include <iostream> |
| 3 | #include <mysql/mysql.h> | ||
| 4 | #include <cstdlib> | 3 | #include <cstdlib> |
| 5 | #include <ctime> | 4 | #include <ctime> |
| 6 | #include <sstream> | 5 | #include <sstream> |
| 7 | #include <twitcurl.h> | 6 | #include <twitcurl.h> |
| 8 | #include <unistd.h> | 7 | #include <unistd.h> |
| 8 | #include <verbly.h> | ||
| 9 | 9 | ||
| 10 | int db_error(MYSQL* driver, const char* error) | 10 | std::string capitalize(std::string input) |
| 11 | { | 11 | { |
| 12 | std::cout << error << ": " << mysql_error(driver) << std::endl; | 12 | std::string result; |
| 13 | return 1; | 13 | bool capnext = true; |
| 14 | |||
| 15 | for (auto ch : input) | ||
| 16 | { | ||
| 17 | if (capnext) | ||
| 18 | { | ||
| 19 | result += toupper(ch); | ||
| 20 | capnext = false; | ||
| 21 | } else { | ||
| 22 | result += ch; | ||
| 23 | } | ||
| 24 | |||
| 25 | if ((ch == ' ') || (ch == '-')) | ||
| 26 | { | ||
| 27 | capnext = true; | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | return result; | ||
| 14 | } | 32 | } |
| 15 | 33 | ||
| 16 | int main(int argc, char** argv) | 34 | int main(int argc, char** argv) |
| @@ -18,10 +36,6 @@ int main(int argc, char** argv) | |||
| 18 | srand(time(NULL)); | 36 | srand(time(NULL)); |
| 19 | 37 | ||
| 20 | YAML::Node config = YAML::LoadFile("config.yml"); | 38 | YAML::Node config = YAML::LoadFile("config.yml"); |
| 21 | const char* host = config["host"].as<std::string>().c_str(); | ||
| 22 | const char* user = config["user"].as<std::string>().c_str(); | ||
| 23 | const char* pass = config["pass"].as<std::string>().c_str(); | ||
| 24 | const char* db = config["db"].as<std::string>().c_str(); | ||
| 25 | 39 | ||
| 26 | // Forms | 40 | // Forms |
| 27 | std::vector<std::string> forms; | 41 | std::vector<std::string> forms; |
| @@ -50,13 +64,10 @@ int main(int argc, char** argv) | |||
| 50 | return 2; | 64 | return 2; |
| 51 | } | 65 | } |
| 52 | 66 | ||
| 53 | // WordNet data | 67 | // verbly |
| 54 | MYSQL* driver = mysql_init(NULL); | 68 | verbly::data database("data.sqlite3"); |
| 55 | if (!mysql_real_connect(driver, host, user, pass, db, 0, NULL, 0)) | ||
| 56 | { | ||
| 57 | return db_error(driver, "Error connecting to database"); | ||
| 58 | } | ||
| 59 | 69 | ||
| 70 | |||
| 60 | twitCurl twitter; | 71 | twitCurl twitter; |
| 61 | twitter.getOAuth().setConsumerKey(config["consumer_key"].as<std::string>()); | 72 | twitter.getOAuth().setConsumerKey(config["consumer_key"].as<std::string>()); |
| 62 | twitter.getOAuth().setConsumerSecret(config["consumer_secret"].as<std::string>()); | 73 | twitter.getOAuth().setConsumerSecret(config["consumer_secret"].as<std::string>()); |
| @@ -73,50 +84,25 @@ int main(int argc, char** argv) | |||
| 73 | int i; | 84 | int i; |
| 74 | while ((i = form.find("{adj}")) != std::string::npos) | 85 | while ((i = form.find("{adj}")) != std::string::npos) |
| 75 | { | 86 | { |
| 76 | const char* getword = "SELECT word FROM wn_synset WHERE ss_type = 'a' OR ss_type = 's' ORDER BY RAND() LIMIT 1"; | 87 | verbly::adjective adj = database.adjectives().random(true).limit(1).run().front(); |
| 77 | if (mysql_query(driver, getword)) return db_error(driver, "Query failed"); | 88 | form.replace(i, 5, capitalize(adj.base_form())); |
| 78 | MYSQL_RES* getword2 = mysql_use_result(driver); if (getword2 == NULL) return db_error(driver, "Query failed"); | ||
| 79 | MYSQL_ROW getword3 = mysql_fetch_row(getword2); if (getword3 == NULL) return db_error(driver, "Query failed"); | ||
| 80 | std::string adj {getword3[0]}; | ||
| 81 | mysql_free_result(getword2); | ||
| 82 | |||
| 83 | adj[0] = toupper(adj[0]); | ||
| 84 | |||
| 85 | int j; | ||
| 86 | while ((j = adj.find("_")) != std::string::npos) | ||
| 87 | { | ||
| 88 | adj[j] = ' '; | ||
| 89 | adj[j+1] = toupper(adj[j+1]); | ||
| 90 | } | ||
| 91 | |||
| 92 | if (adj[adj.size()-1] == ')') | ||
| 93 | { | ||
| 94 | adj.resize(adj.size()-3); | ||
| 95 | } | ||
| 96 | |||
| 97 | form.replace(i, 5, adj); | ||
| 98 | } | 89 | } |
| 99 | 90 | ||
| 100 | // Nouns | 91 | // Nouns |
| 101 | while ((i = form.find("{noun}")) != std::string::npos) | 92 | while ((i = form.find("{noun}")) != std::string::npos) |
| 102 | { | 93 | { |
| 103 | const char* getword = "SELECT word FROM wn_synset WHERE ss_type = 'n' ORDER BY RAND() LIMIT 1"; | 94 | std::string nf; |
| 104 | if (mysql_query(driver, getword)) return db_error(driver, "Query failed"); | 95 | for (;;) |
| 105 | MYSQL_RES* getword2 = mysql_use_result(driver); if (getword2 == NULL) return db_error(driver, "Query failed"); | ||
| 106 | MYSQL_ROW getword3 = mysql_fetch_row(getword2); if (getword3 == NULL) return db_error(driver, "Query failed"); | ||
| 107 | std::string noun {getword3[0]}; | ||
| 108 | mysql_free_result(getword2); | ||
| 109 | |||
| 110 | noun[0] = toupper(noun[0]); | ||
| 111 | |||
| 112 | int j; | ||
| 113 | while ((j = noun.find("_")) != std::string::npos) | ||
| 114 | { | 96 | { |
| 115 | noun[j] = ' '; | 97 | verbly::noun n = database.nouns().is_not_proper(true).random(true).limit(1).run().front(); |
| 116 | noun[j+1] = toupper(noun[j+1]); | 98 | if (n.singular_form().find("genus") == std::string::npos) |
| 99 | { | ||
| 100 | nf = n.singular_form(); | ||
| 101 | break; | ||
| 102 | } | ||
| 117 | } | 103 | } |
| 118 | 104 | ||
| 119 | form.replace(i, 6, noun); | 105 | form.replace(i, 6, capitalize(nf)); |
| 120 | } | 106 | } |
| 121 | 107 | ||
| 122 | if (form.size() > 140) | 108 | if (form.size() > 140) |
| @@ -137,6 +123,4 @@ int main(int argc, char** argv) | |||
| 137 | std::cout << "Waiting" << std::endl; | 123 | std::cout << "Waiting" << std::endl; |
| 138 | sleep(60 * 60 * 3); | 124 | sleep(60 * 60 * 3); |
| 139 | } | 125 | } |
| 140 | |||
| 141 | mysql_close(driver); | ||
| 142 | } | 126 | } |
| diff --git a/vendor/verbly b/vendor/verbly new file mode 160000 | |||
| Subproject 365dda7937dae0b6edef1f498473c57c715eec1 | |||
