diff options
Diffstat (limited to 'nancy.cpp')
-rw-r--r-- | nancy.cpp | 88 |
1 files changed, 36 insertions, 52 deletions
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 | } |