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 | ||
