diff options
-rw-r--r-- | CMakeLists.txt | 12 | ||||
-rw-r--r-- | dialogue.cpp | 66 | ||||
-rw-r--r-- | histogram.cpp | 44 | ||||
-rw-r--r-- | histogram.h | 20 | ||||
m--------- | vendor/rawr-ebooks | 0 |
5 files changed, 56 insertions, 86 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f563ae5..096d08d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt | |||
@@ -1,11 +1,17 @@ | |||
1 | cmake_minimum_required (VERSION 3.1) | 1 | cmake_minimum_required (VERSION 3.1) |
2 | project (rawr-ebooks) | 2 | project (rawr-ebooks) |
3 | 3 | ||
4 | find_package(PkgConfig) | ||
5 | pkg_check_modules(yaml-cpp yaml-cpp REQUIRED) | ||
6 | |||
4 | add_subdirectory(vendor/rawr-ebooks EXCLUDE_FROM_ALL) | 7 | add_subdirectory(vendor/rawr-ebooks EXCLUDE_FROM_ALL) |
5 | 8 | ||
6 | include_directories(vendor/rawr-ebooks) | 9 | include_directories( |
10 | vendor/rawr-ebooks | ||
11 | vendor/rawr-ebooks/vendor/libtwittercpp/src | ||
12 | ${yaml-cpp_INCLUDE_DIRS}) | ||
7 | 13 | ||
8 | add_executable(garnet dialogue.cpp histogram.cpp) | 14 | add_executable(garnet dialogue.cpp) |
9 | set_property(TARGET garnet PROPERTY CXX_STANDARD 17) | 15 | set_property(TARGET garnet PROPERTY CXX_STANDARD 17) |
10 | set_property(TARGET garnet PROPERTY CXX_STANDARD_REQUIRED ON) | 16 | set_property(TARGET garnet PROPERTY CXX_STANDARD_REQUIRED ON) |
11 | target_link_libraries(garnet rawr) | 17 | target_link_libraries(garnet rawr twitter++ ${yaml-cpp_LIBRARIES}) |
diff --git a/dialogue.cpp b/dialogue.cpp index 47a761d..1e95d2b 100644 --- a/dialogue.cpp +++ b/dialogue.cpp | |||
@@ -2,19 +2,17 @@ | |||
2 | #include "identifier.h" | 2 | #include "identifier.h" |
3 | #include "histogram.h" | 3 | #include "histogram.h" |
4 | #include <rawr.h> | 4 | #include <rawr.h> |
5 | #include <cstdlib> | ||
6 | #include <ctime> | ||
7 | #include <map> | 5 | #include <map> |
8 | #include <string> | 6 | #include <string> |
9 | #include <iostream> | 7 | #include <iostream> |
10 | #include <sstream> | 8 | #include <sstream> |
11 | 9 | #include <random> | |
12 | 10 | #include <twitter.h> | |
11 | #include <yaml-cpp/yaml.h> | ||
13 | 12 | ||
14 | using speakerstore = identifier<std::string>; | 13 | using speakerstore = identifier<std::string>; |
15 | using speaker_id = speakerstore::key_type; | 14 | using speaker_id = speakerstore::key_type; |
16 | 15 | ||
17 | |||
18 | struct speaker_data { | 16 | struct speaker_data { |
19 | 17 | ||
20 | std::string name; | 18 | std::string name; |
@@ -24,21 +22,39 @@ struct speaker_data { | |||
24 | 22 | ||
25 | }; | 23 | }; |
26 | 24 | ||
25 | int main(int argc, char** argv) | ||
26 | { | ||
27 | if (argc != 2) | ||
28 | { | ||
29 | std::cout << "usage: garnet [configfile]" << std::endl; | ||
30 | return -1; | ||
31 | } | ||
32 | |||
33 | std::random_device randomDevice; | ||
34 | std::mt19937 rng(randomDevice()); | ||
27 | 35 | ||
36 | std::string configfile(argv[1]); | ||
37 | YAML::Node config = YAML::LoadFile(configfile); | ||
28 | 38 | ||
39 | twitter::auth auth( | ||
40 | config["consumer_key"].as<std::string>(), | ||
41 | config["consumer_secret"].as<std::string>(), | ||
42 | config["access_key"].as<std::string>(), | ||
43 | config["access_secret"].as<std::string>()); | ||
29 | 44 | ||
30 | int main(int, char**) | 45 | twitter::client client(auth); |
31 | { | ||
32 | srand(time(NULL)); | ||
33 | rand(); rand(); rand(); rand(); | ||
34 | 46 | ||
35 | speakerstore speakers; | 47 | speakerstore speakers; |
36 | std::map<speaker_id, speaker_data> speakerData; | 48 | std::map<speaker_id, speaker_data> speakerData; |
37 | histogram<speaker_id> allSpeakers; | 49 | histogram<speaker_id> allSpeakers; |
38 | 50 | ||
51 | using csv = | ||
52 | io::CSVReader< | ||
53 | 2, | ||
54 | io::trim_chars<' ', '\t'>, | ||
55 | io::double_quote_escape<',', '"'>>; | ||
39 | 56 | ||
40 | 57 | csv in(config["transcript"].as<std::string>()); | |
41 | io::CSVReader<2,io::trim_chars<' ', '\t'>,io::double_quote_escape<',', '"'>> in("../dialogue.csv"); | ||
42 | std::string speaker; | 58 | std::string speaker; |
43 | std::string line; | 59 | std::string line; |
44 | 60 | ||
@@ -85,11 +101,10 @@ int main(int, char**) | |||
85 | { | 101 | { |
86 | std::set<speaker_id> pastSpeakers; | 102 | std::set<speaker_id> pastSpeakers; |
87 | 103 | ||
88 | 104 | speaker_id curSpeaker = allSpeakers.next(rng); | |
89 | speaker_id curSpeaker = allSpeakers.next(); | ||
90 | 105 | ||
91 | std::ostringstream theEnd; | 106 | std::ostringstream theEnd; |
92 | int maxLines = rand() % 4 + 3; | 107 | int maxLines = std::uniform_int_distribution<int>(3, 6)(rng); |
93 | 108 | ||
94 | for (int i = 0; i < maxLines; i++) | 109 | for (int i = 0; i < maxLines; i++) |
95 | { | 110 | { |
@@ -102,7 +117,8 @@ int main(int, char**) | |||
102 | theEnd << curSd.name << ": "; | 117 | theEnd << curSd.name << ": "; |
103 | } | 118 | } |
104 | 119 | ||
105 | std::string curLine = curSd.chain.randomSentence(rand() % 30 + 1); | 120 | int maxL = std::uniform_int_distribution<int>(1, 30)(rng); |
121 | std::string curLine = curSd.chain.randomSentence(maxL, rng); | ||
106 | 122 | ||
107 | if (curSd.name == "" && | 123 | if (curSd.name == "" && |
108 | curLine[0] != '[' && | 124 | curLine[0] != '[' && |
@@ -116,13 +132,16 @@ int main(int, char**) | |||
116 | 132 | ||
117 | theEnd << std::endl; | 133 | theEnd << std::endl; |
118 | 134 | ||
119 | speaker_id repeatSpeaker = *std::next(std::begin(pastSpeakers), rand() % pastSpeakers.size()); | 135 | int psi = |
136 | std::uniform_int_distribution<int>(0, pastSpeakers.size()-1)(rng); | ||
137 | |||
138 | speaker_id repeatSpeaker = *std::next(std::begin(pastSpeakers), psi); | ||
120 | if (repeatSpeaker != curSpeaker && | 139 | if (repeatSpeaker != curSpeaker && |
121 | rand() % 3 == 0) | 140 | std::bernoulli_distribution(1.0 / 3.0)(rng)) |
122 | { | 141 | { |
123 | curSpeaker = repeatSpeaker; | 142 | curSpeaker = repeatSpeaker; |
124 | } else { | 143 | } else { |
125 | curSpeaker = curSd.nextSpeaker.next(); | 144 | curSpeaker = curSd.nextSpeaker.next(rng); |
126 | } | 145 | } |
127 | } | 146 | } |
128 | 147 | ||
@@ -131,9 +150,18 @@ int main(int, char**) | |||
131 | output = output.substr(0, output.find_last_of('\n')); | 150 | output = output.substr(0, output.find_last_of('\n')); |
132 | std::cout << output; | 151 | std::cout << output; |
133 | 152 | ||
153 | try | ||
154 | { | ||
155 | client.updateStatus(output); | ||
156 | } catch (const twitter::twitter_error& error) | ||
157 | { | ||
158 | std::cout << "Twitter error while tweeting: " << error.what() | ||
159 | << std::endl; | ||
160 | } | ||
161 | |||
134 | std::cout << std::endl; | 162 | std::cout << std::endl; |
135 | std::cout << std::endl; | 163 | std::cout << std::endl; |
136 | 164 | ||
137 | getc(stdin); | 165 | std::this_thread::sleep_for(std::chrono::hours(4)); |
138 | } | 166 | } |
139 | } | 167 | } |
diff --git a/histogram.cpp b/histogram.cpp deleted file mode 100644 index 38fca45..0000000 --- a/histogram.cpp +++ /dev/null | |||
@@ -1,44 +0,0 @@ | |||
1 | #include "histogram.h" | ||
2 | #include <cstdlib> | ||
3 | #include <iostream> | ||
4 | |||
5 | template <class T> | ||
6 | void histogram<T>::add(const T& inst) | ||
7 | { | ||
8 | freqtable[inst]++; | ||
9 | } | ||
10 | |||
11 | template <class T> | ||
12 | void histogram<T>::compile() | ||
13 | { | ||
14 | distribution.clear(); | ||
15 | |||
16 | int max = 0; | ||
17 | for (auto& it : freqtable) | ||
18 | { | ||
19 | max += it.second; | ||
20 | distribution.emplace(max, it.first); | ||
21 | } | ||
22 | |||
23 | freqtable.clear(); | ||
24 | } | ||
25 | |||
26 | template <class T> | ||
27 | const T& histogram<T>::next() const | ||
28 | { | ||
29 | int max = distribution.rbegin()->first; | ||
30 | int r = rand() % max; | ||
31 | |||
32 | return distribution.upper_bound(r)->second; | ||
33 | } | ||
34 | |||
35 | template <class T> | ||
36 | void histogram<T>::print() const | ||
37 | { | ||
38 | for (auto& freqpair : freqtable) | ||
39 | { | ||
40 | std::cout << freqpair.first << ": " << freqpair.second << std::endl; | ||
41 | } | ||
42 | } | ||
43 | |||
44 | template class histogram <unsigned long>; | ||
diff --git a/histogram.h b/histogram.h deleted file mode 100644 index 76d8f1b..0000000 --- a/histogram.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | #ifndef HISTOGRAM_H_24094D97 | ||
2 | #define HISTOGRAM_H_24094D97 | ||
3 | |||
4 | #include <map> | ||
5 | #include <string> | ||
6 | |||
7 | template <class T> | ||
8 | class histogram { | ||
9 | public: | ||
10 | void add(const T& inst); | ||
11 | void compile(); | ||
12 | const T& next() const; | ||
13 | void print() const; | ||
14 | |||
15 | private: | ||
16 | std::map<T, int> freqtable; | ||
17 | std::map<int, T> distribution; | ||
18 | }; | ||
19 | |||
20 | #endif /* end of include guard: HISTOGRAM_H_24094D97 */ | ||
diff --git a/vendor/rawr-ebooks b/vendor/rawr-ebooks | |||
Subproject 1890eb5d4a496aea5e9114550081ca63bd280f3 | Subproject 01fcbeb60da0bff33d5d9f5b870d444cc418a01 | ||